xref: /llvm-project/llvm/test/Instrumentation/HWAddressSanitizer/RISCV/basic.ll (revision 0673642cab6b6a9eec20d4ea4ee6bc46db47e04c)
16e8ce167SVitaly Buka; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2f8738212SAlexey Baturo; Test basic address sanitizer instrumentation.
3f8738212SAlexey Baturo;
4bb637396SVitaly Buka; RUN: opt < %s -passes=hwasan -S | FileCheck %s
5bb637396SVitaly Buka; RUN: opt < %s -passes=hwasan -hwasan-inline-fast-path-checks=0 -S | FileCheck %s --check-prefixes=NOFASTPATH
6bb637396SVitaly Buka; RUN: opt < %s -passes=hwasan -hwasan-inline-fast-path-checks=1 -S | FileCheck %s --check-prefixes=FASTPATH
7*0673642cSVitaly Buka; RUN: opt < %s -passes=hwasan -hwasan-recover=0 -hwasan-mapping-offset-dynamic=ifunc -S | FileCheck %s --check-prefixes=ABORT-DYNAMIC-SHADOW
8*0673642cSVitaly Buka; RUN: opt < %s -passes=hwasan -hwasan-recover=1 -hwasan-mapping-offset-dynamic=ifunc -S | FileCheck %s --check-prefixes=RECOVER-DYNAMIC-SHADOW
96e8ce167SVitaly Buka; RUN: opt < %s -passes=hwasan -hwasan-recover=0 -hwasan-mapping-offset=0 -S | FileCheck %s --check-prefixes=ABORT-ZERO-BASED-SHADOW
106e8ce167SVitaly Buka; RUN: opt < %s -passes=hwasan -hwasan-recover=1 -hwasan-mapping-offset=0 -S | FileCheck %s --check-prefixes=RECOVER-ZERO-BASED-SHADOW
11f8738212SAlexey Baturo
12f8738212SAlexey Baturo
13f8738212SAlexey Baturotarget datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
14f8738212SAlexey Baturotarget triple = "riscv64-unknown-linux"
15f8738212SAlexey Baturo
16f8738212SAlexey Baturodefine i8 @test_load8(ptr %a) sanitize_hwaddress {
17bb637396SVitaly Buka; CHECK-LABEL: define i8 @test_load8
18bb637396SVitaly Buka; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {
19bb637396SVitaly Buka; CHECK-NEXT:  entry:
20bb637396SVitaly Buka; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
21bb637396SVitaly Buka; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
22bb637396SVitaly Buka; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
23bb637396SVitaly Buka; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
24bb637396SVitaly Buka; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
25be601928SVitaly Buka; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
26be601928SVitaly Buka; CHECK-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
27be601928SVitaly Buka; CHECK-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
28be601928SVitaly Buka; CHECK-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
29be601928SVitaly Buka; CHECK-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
30be601928SVitaly Buka; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
31be601928SVitaly Buka; CHECK-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
32be601928SVitaly Buka; CHECK-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
339a2fd97dSFlorian Mayer; CHECK-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2:![0-9]+]]
34be601928SVitaly Buka; CHECK:       12:
35bb637396SVitaly Buka; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 0)
36be601928SVitaly Buka; CHECK-NEXT:    br label [[TMP13]]
37be601928SVitaly Buka; CHECK:       13:
38bb637396SVitaly Buka; CHECK-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4
39bb637396SVitaly Buka; CHECK-NEXT:    ret i8 [[B]]
40bb637396SVitaly Buka;
41bb637396SVitaly Buka; NOFASTPATH-LABEL: define i8 @test_load8
42bb637396SVitaly Buka; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {
43bb637396SVitaly Buka; NOFASTPATH-NEXT:  entry:
44bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
45bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
46bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
47bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
48bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
49bb637396SVitaly Buka; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 0)
50bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4
51bb637396SVitaly Buka; NOFASTPATH-NEXT:    ret i8 [[B]]
52bb637396SVitaly Buka;
53bb637396SVitaly Buka; FASTPATH-LABEL: define i8 @test_load8
54bb637396SVitaly Buka; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {
55bb637396SVitaly Buka; FASTPATH-NEXT:  entry:
56bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
57bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
58bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
59bb637396SVitaly Buka; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
60bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
61be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
62be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
63be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
64be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
65be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
66be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
67be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
68be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
699a2fd97dSFlorian Mayer; FASTPATH-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2:![0-9]+]]
70be601928SVitaly Buka; FASTPATH:       12:
71bb637396SVitaly Buka; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 0)
72be601928SVitaly Buka; FASTPATH-NEXT:    br label [[TMP13]]
73be601928SVitaly Buka; FASTPATH:       13:
74bb637396SVitaly Buka; FASTPATH-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4
75bb637396SVitaly Buka; FASTPATH-NEXT:    ret i8 [[B]]
76bb637396SVitaly Buka;
776e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-LABEL: define i8 @test_load8
786e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {
796e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:  entry:
806e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
81be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
82be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
83be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
84be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
85be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
86be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
87be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
88be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
899a2fd97dSFlorian Mayer; ABORT-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2:![0-9]+]]
90be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW:       8:
916e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 0)
92be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    br label [[TMP9]]
93be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW:       9:
946e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4
956e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    ret i8 [[B]]
966e8ce167SVitaly Buka;
976e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-LABEL: define i8 @test_load8
986e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {
996e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:
1006e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
1016e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1026e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1036e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1046e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1056e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1066e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
1076e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1086e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
1099a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2:![0-9]+]]
1106e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       8:
1116e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
1129a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
1136e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       10:
1146e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 96", "{x10}"(i64 [[TMP0]])
1156e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]
1166e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       11:
1176e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15
1186e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
1196e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 0
1206e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
1219a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
1226e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       16:
1236e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15
1246e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
1256e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
1266e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
1279a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
1286e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       21:
1296e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]
1306e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       22:
1316e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4
1326e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i8 [[B]]
1336e8ce167SVitaly Buka;
1346e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-LABEL: define i8 @test_load8
1356e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {
1366e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:
1376e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
138be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
139be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
140be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
141be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
142be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
143be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
144be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
145be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
1469a2fd97dSFlorian Mayer; ABORT-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2:![0-9]+]]
147be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW:       8:
1486e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 0)
149be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    br label [[TMP9]]
150be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW:       9:
1516e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4
1526e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i8 [[B]]
1536e8ce167SVitaly Buka;
1546e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-LABEL: define i8 @test_load8
1556e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {
1566e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:
1576e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
1586e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1596e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1606e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1616e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1626e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1636e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
1646e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1656e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
1669a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2:![0-9]+]]
1676e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       8:
1686e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
1699a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
1706e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       10:
1716e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 96", "{x10}"(i64 [[TMP0]])
1726e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]
1736e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       11:
1746e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15
1756e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
1766e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 0
1776e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
1789a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
1796e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       16:
1806e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15
1816e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
1826e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
1836e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
1849a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
1856e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       21:
1866e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]
1876e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       22:
1886e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4
1896e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i8 [[B]]
1906e8ce167SVitaly Buka;
191f8738212SAlexey Baturoentry:
192f8738212SAlexey Baturo  %b = load i8, ptr %a, align 4
193f8738212SAlexey Baturo  ret i8 %b
194f8738212SAlexey Baturo}
195f8738212SAlexey Baturo
196f8738212SAlexey Baturodefine i16 @test_load16(ptr %a) sanitize_hwaddress {
197bb637396SVitaly Buka; CHECK-LABEL: define i16 @test_load16
198bb637396SVitaly Buka; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
199bb637396SVitaly Buka; CHECK-NEXT:  entry:
200bb637396SVitaly Buka; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
201bb637396SVitaly Buka; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
202bb637396SVitaly Buka; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
203bb637396SVitaly Buka; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
204bb637396SVitaly Buka; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
205be601928SVitaly Buka; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
206be601928SVitaly Buka; CHECK-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
207be601928SVitaly Buka; CHECK-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
208be601928SVitaly Buka; CHECK-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
209be601928SVitaly Buka; CHECK-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
210be601928SVitaly Buka; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
211be601928SVitaly Buka; CHECK-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
212be601928SVitaly Buka; CHECK-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
2139a2fd97dSFlorian Mayer; CHECK-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
214be601928SVitaly Buka; CHECK:       12:
215bb637396SVitaly Buka; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 1)
216be601928SVitaly Buka; CHECK-NEXT:    br label [[TMP13]]
217be601928SVitaly Buka; CHECK:       13:
218bb637396SVitaly Buka; CHECK-NEXT:    [[B:%.*]] = load i16, ptr [[A]], align 4
219bb637396SVitaly Buka; CHECK-NEXT:    ret i16 [[B]]
220bb637396SVitaly Buka;
221bb637396SVitaly Buka; NOFASTPATH-LABEL: define i16 @test_load16
222bb637396SVitaly Buka; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
223bb637396SVitaly Buka; NOFASTPATH-NEXT:  entry:
224bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
225bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
226bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
227bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
228bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
229bb637396SVitaly Buka; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 1)
230bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[B:%.*]] = load i16, ptr [[A]], align 4
231bb637396SVitaly Buka; NOFASTPATH-NEXT:    ret i16 [[B]]
232bb637396SVitaly Buka;
233bb637396SVitaly Buka; FASTPATH-LABEL: define i16 @test_load16
234bb637396SVitaly Buka; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
235bb637396SVitaly Buka; FASTPATH-NEXT:  entry:
236bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
237bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
238bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
239bb637396SVitaly Buka; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
240bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
241be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
242be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
243be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
244be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
245be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
246be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
247be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
248be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
2499a2fd97dSFlorian Mayer; FASTPATH-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
250be601928SVitaly Buka; FASTPATH:       12:
251bb637396SVitaly Buka; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 1)
252be601928SVitaly Buka; FASTPATH-NEXT:    br label [[TMP13]]
253be601928SVitaly Buka; FASTPATH:       13:
254bb637396SVitaly Buka; FASTPATH-NEXT:    [[B:%.*]] = load i16, ptr [[A]], align 4
255bb637396SVitaly Buka; FASTPATH-NEXT:    ret i16 [[B]]
256bb637396SVitaly Buka;
2576e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-LABEL: define i16 @test_load16
2586e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
2596e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:  entry:
2606e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
261be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
262be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
263be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
264be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
265be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
266be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
267be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
268be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
2699a2fd97dSFlorian Mayer; ABORT-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
270be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW:       8:
2716e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 1)
272be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    br label [[TMP9]]
273be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW:       9:
2746e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i16, ptr [[A]], align 4
2756e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    ret i16 [[B]]
2766e8ce167SVitaly Buka;
2776e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-LABEL: define i16 @test_load16
2786e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
2796e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:
2806e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
2816e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
2826e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
2836e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
2846e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
2856e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
2866e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
2876e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
2886e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
2899a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
2906e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       8:
2916e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
2929a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
2936e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       10:
2946e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 97", "{x10}"(i64 [[TMP0]])
2956e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]
2966e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       11:
2976e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15
2986e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
2996e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 1
3006e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
3019a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
3026e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       16:
3036e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15
3046e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
3056e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
3066e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
3079a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
3086e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       21:
3096e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]
3106e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       22:
3116e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i16, ptr [[A]], align 4
3126e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i16 [[B]]
3136e8ce167SVitaly Buka;
3146e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-LABEL: define i16 @test_load16
3156e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
3166e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:
3176e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
318be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
319be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
320be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
321be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
322be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
323be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
324be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
325be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
3269a2fd97dSFlorian Mayer; ABORT-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
327be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW:       8:
3286e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 1)
329be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    br label [[TMP9]]
330be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW:       9:
3316e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i16, ptr [[A]], align 4
3326e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i16 [[B]]
3336e8ce167SVitaly Buka;
3346e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-LABEL: define i16 @test_load16
3356e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
3366e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:
3376e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
3386e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
3396e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
3406e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
3416e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
3426e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
3436e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
3446e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
3456e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
3469a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
3476e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       8:
3486e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
3499a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
3506e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       10:
3516e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 97", "{x10}"(i64 [[TMP0]])
3526e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]
3536e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       11:
3546e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15
3556e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
3566e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 1
3576e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
3589a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
3596e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       16:
3606e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15
3616e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
3626e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
3636e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
3649a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
3656e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       21:
3666e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]
3676e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       22:
3686e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i16, ptr [[A]], align 4
3696e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i16 [[B]]
3706e8ce167SVitaly Buka;
371f8738212SAlexey Baturoentry:
372f8738212SAlexey Baturo  %b = load i16, ptr %a, align 4
373f8738212SAlexey Baturo  ret i16 %b
374f8738212SAlexey Baturo}
375f8738212SAlexey Baturo
376f8738212SAlexey Baturodefine i32 @test_load32(ptr %a) sanitize_hwaddress {
377bb637396SVitaly Buka; CHECK-LABEL: define i32 @test_load32
378bb637396SVitaly Buka; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
379bb637396SVitaly Buka; CHECK-NEXT:  entry:
380bb637396SVitaly Buka; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
381bb637396SVitaly Buka; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
382bb637396SVitaly Buka; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
383bb637396SVitaly Buka; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
384bb637396SVitaly Buka; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
385be601928SVitaly Buka; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
386be601928SVitaly Buka; CHECK-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
387be601928SVitaly Buka; CHECK-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
388be601928SVitaly Buka; CHECK-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
389be601928SVitaly Buka; CHECK-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
390be601928SVitaly Buka; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
391be601928SVitaly Buka; CHECK-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
392be601928SVitaly Buka; CHECK-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
3939a2fd97dSFlorian Mayer; CHECK-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
394be601928SVitaly Buka; CHECK:       12:
395bb637396SVitaly Buka; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 2)
396be601928SVitaly Buka; CHECK-NEXT:    br label [[TMP13]]
397be601928SVitaly Buka; CHECK:       13:
398bb637396SVitaly Buka; CHECK-NEXT:    [[B:%.*]] = load i32, ptr [[A]], align 4
399bb637396SVitaly Buka; CHECK-NEXT:    ret i32 [[B]]
400bb637396SVitaly Buka;
401bb637396SVitaly Buka; NOFASTPATH-LABEL: define i32 @test_load32
402bb637396SVitaly Buka; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
403bb637396SVitaly Buka; NOFASTPATH-NEXT:  entry:
404bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
405bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
406bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
407bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
408bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
409bb637396SVitaly Buka; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 2)
410bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[B:%.*]] = load i32, ptr [[A]], align 4
411bb637396SVitaly Buka; NOFASTPATH-NEXT:    ret i32 [[B]]
412bb637396SVitaly Buka;
413bb637396SVitaly Buka; FASTPATH-LABEL: define i32 @test_load32
414bb637396SVitaly Buka; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
415bb637396SVitaly Buka; FASTPATH-NEXT:  entry:
416bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
417bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
418bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
419bb637396SVitaly Buka; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
420bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
421be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
422be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
423be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
424be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
425be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
426be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
427be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
428be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
4299a2fd97dSFlorian Mayer; FASTPATH-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
430be601928SVitaly Buka; FASTPATH:       12:
431bb637396SVitaly Buka; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 2)
432be601928SVitaly Buka; FASTPATH-NEXT:    br label [[TMP13]]
433be601928SVitaly Buka; FASTPATH:       13:
434bb637396SVitaly Buka; FASTPATH-NEXT:    [[B:%.*]] = load i32, ptr [[A]], align 4
435bb637396SVitaly Buka; FASTPATH-NEXT:    ret i32 [[B]]
436bb637396SVitaly Buka;
4376e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-LABEL: define i32 @test_load32
4386e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
4396e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:  entry:
4406e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
441be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
442be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
443be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
444be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
445be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
446be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
447be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
448be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
4499a2fd97dSFlorian Mayer; ABORT-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
450be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW:       8:
4516e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 2)
452be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    br label [[TMP9]]
453be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW:       9:
4546e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i32, ptr [[A]], align 4
4556e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    ret i32 [[B]]
4566e8ce167SVitaly Buka;
4576e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-LABEL: define i32 @test_load32
4586e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
4596e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:
4606e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
4616e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
4626e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
4636e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
4646e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
4656e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
4666e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
4676e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
4686e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
4699a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
4706e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       8:
4716e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
4729a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
4736e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       10:
4746e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 98", "{x10}"(i64 [[TMP0]])
4756e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]
4766e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       11:
4776e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15
4786e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
4796e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 3
4806e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
4819a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
4826e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       16:
4836e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15
4846e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
4856e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
4866e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
4879a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
4886e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       21:
4896e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]
4906e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       22:
4916e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i32, ptr [[A]], align 4
4926e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i32 [[B]]
4936e8ce167SVitaly Buka;
4946e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-LABEL: define i32 @test_load32
4956e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
4966e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:
4976e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
498be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
499be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
500be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
501be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
502be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
503be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
504be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
505be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
5069a2fd97dSFlorian Mayer; ABORT-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
507be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW:       8:
5086e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 2)
509be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    br label [[TMP9]]
510be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW:       9:
5116e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i32, ptr [[A]], align 4
5126e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i32 [[B]]
5136e8ce167SVitaly Buka;
5146e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-LABEL: define i32 @test_load32
5156e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
5166e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:
5176e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
5186e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
5196e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
5206e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
5216e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
5226e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
5236e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
5246e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
5256e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
5269a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
5276e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       8:
5286e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
5299a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
5306e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       10:
5316e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 98", "{x10}"(i64 [[TMP0]])
5326e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]
5336e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       11:
5346e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15
5356e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
5366e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 3
5376e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
5389a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
5396e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       16:
5406e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15
5416e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
5426e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
5436e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
5449a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
5456e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       21:
5466e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]
5476e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       22:
5486e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i32, ptr [[A]], align 4
5496e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i32 [[B]]
5506e8ce167SVitaly Buka;
551f8738212SAlexey Baturoentry:
552f8738212SAlexey Baturo  %b = load i32, ptr %a, align 4
553f8738212SAlexey Baturo  ret i32 %b
554f8738212SAlexey Baturo}
555f8738212SAlexey Baturo
556f8738212SAlexey Baturodefine i64 @test_load64(ptr %a) sanitize_hwaddress {
557bb637396SVitaly Buka; CHECK-LABEL: define i64 @test_load64
558bb637396SVitaly Buka; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
559bb637396SVitaly Buka; CHECK-NEXT:  entry:
560bb637396SVitaly Buka; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
561bb637396SVitaly Buka; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
562bb637396SVitaly Buka; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
563bb637396SVitaly Buka; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
564bb637396SVitaly Buka; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
565be601928SVitaly Buka; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
566be601928SVitaly Buka; CHECK-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
567be601928SVitaly Buka; CHECK-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
568be601928SVitaly Buka; CHECK-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
569be601928SVitaly Buka; CHECK-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
570be601928SVitaly Buka; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
571be601928SVitaly Buka; CHECK-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
572be601928SVitaly Buka; CHECK-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
5739a2fd97dSFlorian Mayer; CHECK-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
574be601928SVitaly Buka; CHECK:       12:
575bb637396SVitaly Buka; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 3)
576be601928SVitaly Buka; CHECK-NEXT:    br label [[TMP13]]
577be601928SVitaly Buka; CHECK:       13:
578bb637396SVitaly Buka; CHECK-NEXT:    [[B:%.*]] = load i64, ptr [[A]], align 8
579bb637396SVitaly Buka; CHECK-NEXT:    ret i64 [[B]]
580bb637396SVitaly Buka;
581bb637396SVitaly Buka; NOFASTPATH-LABEL: define i64 @test_load64
582bb637396SVitaly Buka; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
583bb637396SVitaly Buka; NOFASTPATH-NEXT:  entry:
584bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
585bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
586bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
587bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
588bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
589bb637396SVitaly Buka; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 3)
590bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[B:%.*]] = load i64, ptr [[A]], align 8
591bb637396SVitaly Buka; NOFASTPATH-NEXT:    ret i64 [[B]]
592bb637396SVitaly Buka;
593bb637396SVitaly Buka; FASTPATH-LABEL: define i64 @test_load64
594bb637396SVitaly Buka; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
595bb637396SVitaly Buka; FASTPATH-NEXT:  entry:
596bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
597bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
598bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
599bb637396SVitaly Buka; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
600bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
601be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
602be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
603be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
604be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
605be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
606be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
607be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
608be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
6099a2fd97dSFlorian Mayer; FASTPATH-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
610be601928SVitaly Buka; FASTPATH:       12:
611bb637396SVitaly Buka; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 3)
612be601928SVitaly Buka; FASTPATH-NEXT:    br label [[TMP13]]
613be601928SVitaly Buka; FASTPATH:       13:
614bb637396SVitaly Buka; FASTPATH-NEXT:    [[B:%.*]] = load i64, ptr [[A]], align 8
615bb637396SVitaly Buka; FASTPATH-NEXT:    ret i64 [[B]]
616bb637396SVitaly Buka;
6176e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-LABEL: define i64 @test_load64
6186e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
6196e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:  entry:
6206e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
621be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
622be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
623be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
624be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
625be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
626be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
627be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
628be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
6299a2fd97dSFlorian Mayer; ABORT-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
630be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW:       8:
6316e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 3)
632be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    br label [[TMP9]]
633be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW:       9:
6346e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i64, ptr [[A]], align 8
6356e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    ret i64 [[B]]
6366e8ce167SVitaly Buka;
6376e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-LABEL: define i64 @test_load64
6386e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
6396e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:
6406e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
6416e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
6426e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
6436e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
6446e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
6456e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
6466e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
6476e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
6486e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
6499a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
6506e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       8:
6516e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
6529a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
6536e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       10:
6546e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 99", "{x10}"(i64 [[TMP0]])
6556e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]
6566e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       11:
6576e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15
6586e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
6596e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 7
6606e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
6619a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
6626e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       16:
6636e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15
6646e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
6656e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
6666e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
6679a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
6686e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       21:
6696e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]
6706e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       22:
6716e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i64, ptr [[A]], align 8
6726e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i64 [[B]]
6736e8ce167SVitaly Buka;
6746e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-LABEL: define i64 @test_load64
6756e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
6766e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:
6776e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
678be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
679be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
680be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
681be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
682be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
683be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
684be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
685be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
6869a2fd97dSFlorian Mayer; ABORT-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
687be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW:       8:
6886e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 3)
689be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    br label [[TMP9]]
690be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW:       9:
6916e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i64, ptr [[A]], align 8
6926e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i64 [[B]]
6936e8ce167SVitaly Buka;
6946e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-LABEL: define i64 @test_load64
6956e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
6966e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:
6976e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
6986e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
6996e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
7006e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
7016e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
7026e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
7036e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
7046e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
7056e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
7069a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
7076e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       8:
7086e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
7099a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
7106e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       10:
7116e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 99", "{x10}"(i64 [[TMP0]])
7126e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]
7136e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       11:
7146e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15
7156e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
7166e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 7
7176e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
7189a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
7196e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       16:
7206e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15
7216e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
7226e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
7236e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
7249a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
7256e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       21:
7266e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]
7276e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       22:
7286e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i64, ptr [[A]], align 8
7296e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i64 [[B]]
7306e8ce167SVitaly Buka;
731f8738212SAlexey Baturoentry:
732f8738212SAlexey Baturo  %b = load i64, ptr %a, align 8
733f8738212SAlexey Baturo  ret i64 %b
734f8738212SAlexey Baturo}
735f8738212SAlexey Baturo
736f8738212SAlexey Baturodefine i128 @test_load128(ptr %a) sanitize_hwaddress {
737bb637396SVitaly Buka; CHECK-LABEL: define i128 @test_load128
738bb637396SVitaly Buka; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
739bb637396SVitaly Buka; CHECK-NEXT:  entry:
740bb637396SVitaly Buka; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
741bb637396SVitaly Buka; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
742bb637396SVitaly Buka; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
743bb637396SVitaly Buka; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
744bb637396SVitaly Buka; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
745be601928SVitaly Buka; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
746be601928SVitaly Buka; CHECK-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
747be601928SVitaly Buka; CHECK-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
748be601928SVitaly Buka; CHECK-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
749be601928SVitaly Buka; CHECK-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
750be601928SVitaly Buka; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
751be601928SVitaly Buka; CHECK-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
752be601928SVitaly Buka; CHECK-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
7539a2fd97dSFlorian Mayer; CHECK-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
754be601928SVitaly Buka; CHECK:       12:
755bb637396SVitaly Buka; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 4)
756be601928SVitaly Buka; CHECK-NEXT:    br label [[TMP13]]
757be601928SVitaly Buka; CHECK:       13:
758bb637396SVitaly Buka; CHECK-NEXT:    [[B:%.*]] = load i128, ptr [[A]], align 16
759bb637396SVitaly Buka; CHECK-NEXT:    ret i128 [[B]]
760bb637396SVitaly Buka;
761bb637396SVitaly Buka; NOFASTPATH-LABEL: define i128 @test_load128
762bb637396SVitaly Buka; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
763bb637396SVitaly Buka; NOFASTPATH-NEXT:  entry:
764bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
765bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
766bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
767bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
768bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
769bb637396SVitaly Buka; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 4)
770bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[B:%.*]] = load i128, ptr [[A]], align 16
771bb637396SVitaly Buka; NOFASTPATH-NEXT:    ret i128 [[B]]
772bb637396SVitaly Buka;
773bb637396SVitaly Buka; FASTPATH-LABEL: define i128 @test_load128
774bb637396SVitaly Buka; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
775bb637396SVitaly Buka; FASTPATH-NEXT:  entry:
776bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
777bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
778bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
779bb637396SVitaly Buka; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
780bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
781be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
782be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
783be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
784be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
785be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
786be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
787be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
788be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
7899a2fd97dSFlorian Mayer; FASTPATH-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
790be601928SVitaly Buka; FASTPATH:       12:
791bb637396SVitaly Buka; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 4)
792be601928SVitaly Buka; FASTPATH-NEXT:    br label [[TMP13]]
793be601928SVitaly Buka; FASTPATH:       13:
794bb637396SVitaly Buka; FASTPATH-NEXT:    [[B:%.*]] = load i128, ptr [[A]], align 16
795bb637396SVitaly Buka; FASTPATH-NEXT:    ret i128 [[B]]
796bb637396SVitaly Buka;
7976e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-LABEL: define i128 @test_load128
7986e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
7996e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:  entry:
8006e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
801be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
802be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
803be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
804be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
805be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
806be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
807be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
808be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
8099a2fd97dSFlorian Mayer; ABORT-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
810be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW:       8:
8116e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 4)
812be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    br label [[TMP9]]
813be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW:       9:
8146e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i128, ptr [[A]], align 16
8156e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    ret i128 [[B]]
8166e8ce167SVitaly Buka;
8176e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-LABEL: define i128 @test_load128
8186e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
8196e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:
8206e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
8216e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
8226e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
8236e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
8246e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
8256e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
8266e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
8276e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
8286e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
8299a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
8306e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       8:
8316e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
8329a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
8336e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       10:
8346e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 100", "{x10}"(i64 [[TMP0]])
8356e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]
8366e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       11:
8376e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15
8386e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
8396e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 15
8406e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
8419a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
8426e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       16:
8436e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15
8446e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
8456e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
8466e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
8479a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
8486e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       21:
8496e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]
8506e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       22:
8516e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i128, ptr [[A]], align 16
8526e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i128 [[B]]
8536e8ce167SVitaly Buka;
8546e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-LABEL: define i128 @test_load128
8556e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
8566e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:
8576e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
858be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
859be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
860be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
861be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
862be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
863be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
864be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
865be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
8669a2fd97dSFlorian Mayer; ABORT-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
867be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW:       8:
8686e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 4)
869be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    br label [[TMP9]]
870be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW:       9:
8716e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i128, ptr [[A]], align 16
8726e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i128 [[B]]
8736e8ce167SVitaly Buka;
8746e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-LABEL: define i128 @test_load128
8756e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
8766e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:
8776e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
8786e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
8796e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
8806e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
8816e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
8826e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
8836e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
8846e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
8856e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
8869a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
8876e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       8:
8886e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
8899a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
8906e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       10:
8916e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 100", "{x10}"(i64 [[TMP0]])
8926e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]
8936e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       11:
8946e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15
8956e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
8966e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 15
8976e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
8989a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
8996e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       16:
9006e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15
9016e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
9026e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
9036e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
9049a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
9056e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       21:
9066e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]
9076e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       22:
9086e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i128, ptr [[A]], align 16
9096e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i128 [[B]]
9106e8ce167SVitaly Buka;
911f8738212SAlexey Baturoentry:
912f8738212SAlexey Baturo  %b = load i128, ptr %a, align 16
913f8738212SAlexey Baturo  ret i128 %b
914f8738212SAlexey Baturo}
915f8738212SAlexey Baturo
916f8738212SAlexey Baturodefine i40 @test_load40(ptr %a) sanitize_hwaddress {
917bb637396SVitaly Buka; CHECK-LABEL: define i40 @test_load40
918bb637396SVitaly Buka; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
919bb637396SVitaly Buka; CHECK-NEXT:  entry:
920bb637396SVitaly Buka; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
921bb637396SVitaly Buka; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
922bb637396SVitaly Buka; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
923bb637396SVitaly Buka; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
924bb637396SVitaly Buka; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
925bb637396SVitaly Buka; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
926bb637396SVitaly Buka; CHECK-NEXT:    call void @__hwasan_loadN(i64 [[TMP4]], i64 5)
927bb637396SVitaly Buka; CHECK-NEXT:    [[B:%.*]] = load i40, ptr [[A]], align 4
928bb637396SVitaly Buka; CHECK-NEXT:    ret i40 [[B]]
929bb637396SVitaly Buka;
930bb637396SVitaly Buka; NOFASTPATH-LABEL: define i40 @test_load40
931bb637396SVitaly Buka; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
932bb637396SVitaly Buka; NOFASTPATH-NEXT:  entry:
933bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
934bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
935bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
936bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
937bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
938bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
939bb637396SVitaly Buka; NOFASTPATH-NEXT:    call void @__hwasan_loadN(i64 [[TMP4]], i64 5)
940bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[B:%.*]] = load i40, ptr [[A]], align 4
941bb637396SVitaly Buka; NOFASTPATH-NEXT:    ret i40 [[B]]
942bb637396SVitaly Buka;
943bb637396SVitaly Buka; FASTPATH-LABEL: define i40 @test_load40
944bb637396SVitaly Buka; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
945bb637396SVitaly Buka; FASTPATH-NEXT:  entry:
946bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
947bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
948bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
949bb637396SVitaly Buka; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
950bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
951bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
952bb637396SVitaly Buka; FASTPATH-NEXT:    call void @__hwasan_loadN(i64 [[TMP4]], i64 5)
953bb637396SVitaly Buka; FASTPATH-NEXT:    [[B:%.*]] = load i40, ptr [[A]], align 4
954bb637396SVitaly Buka; FASTPATH-NEXT:    ret i40 [[B]]
955bb637396SVitaly Buka;
9566e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-LABEL: define i40 @test_load40
9576e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
9586e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:  entry:
9596e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
9606e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
9616e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    call void @__hwasan_loadN(i64 [[TMP0]], i64 5)
9626e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i40, ptr [[A]], align 4
9636e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    ret i40 [[B]]
9646e8ce167SVitaly Buka;
9656e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-LABEL: define i40 @test_load40
9666e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
9676e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:
9686e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
9696e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
9706e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    call void @__hwasan_loadN_noabort(i64 [[TMP0]], i64 5)
9716e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i40, ptr [[A]], align 4
9726e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i40 [[B]]
9736e8ce167SVitaly Buka;
9746e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-LABEL: define i40 @test_load40
9756e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
9766e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:
9776e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
9786e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
9796e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @__hwasan_loadN(i64 [[TMP0]], i64 5)
9806e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i40, ptr [[A]], align 4
9816e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i40 [[B]]
9826e8ce167SVitaly Buka;
9836e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-LABEL: define i40 @test_load40
9846e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {
9856e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:
9866e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
9876e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
9886e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void @__hwasan_loadN_noabort(i64 [[TMP0]], i64 5)
9896e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i40, ptr [[A]], align 4
9906e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i40 [[B]]
9916e8ce167SVitaly Buka;
992f8738212SAlexey Baturoentry:
993f8738212SAlexey Baturo  %b = load i40, ptr %a, align 4
994f8738212SAlexey Baturo  ret i40 %b
995f8738212SAlexey Baturo}
996f8738212SAlexey Baturo
997f8738212SAlexey Baturodefine void @test_store8(ptr %a, i8 %b) sanitize_hwaddress {
998bb637396SVitaly Buka; CHECK-LABEL: define void @test_store8
999bb637396SVitaly Buka; CHECK-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {
1000bb637396SVitaly Buka; CHECK-NEXT:  entry:
1001bb637396SVitaly Buka; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1002bb637396SVitaly Buka; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1003bb637396SVitaly Buka; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1004bb637396SVitaly Buka; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1005bb637396SVitaly Buka; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1006be601928SVitaly Buka; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1007be601928SVitaly Buka; CHECK-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
1008be601928SVitaly Buka; CHECK-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
1009be601928SVitaly Buka; CHECK-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
1010be601928SVitaly Buka; CHECK-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
1011be601928SVitaly Buka; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
1012be601928SVitaly Buka; CHECK-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
1013be601928SVitaly Buka; CHECK-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
10149a2fd97dSFlorian Mayer; CHECK-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
1015be601928SVitaly Buka; CHECK:       12:
1016bb637396SVitaly Buka; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 16)
1017be601928SVitaly Buka; CHECK-NEXT:    br label [[TMP13]]
1018be601928SVitaly Buka; CHECK:       13:
1019bb637396SVitaly Buka; CHECK-NEXT:    store i8 [[B]], ptr [[A]], align 4
1020bb637396SVitaly Buka; CHECK-NEXT:    ret void
1021bb637396SVitaly Buka;
1022bb637396SVitaly Buka; NOFASTPATH-LABEL: define void @test_store8
1023bb637396SVitaly Buka; NOFASTPATH-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {
1024bb637396SVitaly Buka; NOFASTPATH-NEXT:  entry:
1025bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1026bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1027bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1028bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1029bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1030bb637396SVitaly Buka; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 16)
1031bb637396SVitaly Buka; NOFASTPATH-NEXT:    store i8 [[B]], ptr [[A]], align 4
1032bb637396SVitaly Buka; NOFASTPATH-NEXT:    ret void
1033bb637396SVitaly Buka;
1034bb637396SVitaly Buka; FASTPATH-LABEL: define void @test_store8
1035bb637396SVitaly Buka; FASTPATH-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {
1036bb637396SVitaly Buka; FASTPATH-NEXT:  entry:
1037bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1038bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1039bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1040bb637396SVitaly Buka; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1041bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1042be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1043be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
1044be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
1045be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
1046be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
1047be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
1048be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
1049be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
10509a2fd97dSFlorian Mayer; FASTPATH-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
1051be601928SVitaly Buka; FASTPATH:       12:
1052bb637396SVitaly Buka; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 16)
1053be601928SVitaly Buka; FASTPATH-NEXT:    br label [[TMP13]]
1054be601928SVitaly Buka; FASTPATH:       13:
1055bb637396SVitaly Buka; FASTPATH-NEXT:    store i8 [[B]], ptr [[A]], align 4
1056bb637396SVitaly Buka; FASTPATH-NEXT:    ret void
1057bb637396SVitaly Buka;
10586e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store8
10596e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {
10606e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:  entry:
10616e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
1062be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1063be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1064be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1065be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1066be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1067be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
1068be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1069be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
10709a2fd97dSFlorian Mayer; ABORT-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
1071be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW:       8:
10726e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 16)
1073be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    br label [[TMP9]]
1074be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW:       9:
10756e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    store i8 [[B]], ptr [[A]], align 4
10766e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    ret void
10776e8ce167SVitaly Buka;
10786e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store8
10796e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {
10806e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:
10816e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
10826e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
10836e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
10846e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
10856e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
10866e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
10876e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
10886e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
10896e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
10909a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
10916e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       8:
10926e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
10939a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
10946e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       10:
10956e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 112", "{x10}"(i64 [[TMP0]])
10966e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]
10976e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       11:
10986e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15
10996e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
11006e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 0
11016e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
11029a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
11036e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       16:
11046e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15
11056e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
11066e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
11076e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
11089a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
11096e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       21:
11106e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]
11116e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       22:
11126e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    store i8 [[B]], ptr [[A]], align 4
11136e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    ret void
11146e8ce167SVitaly Buka;
11156e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store8
11166e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {
11176e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:
11186e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
1119be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1120be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1121be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1122be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1123be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1124be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
1125be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1126be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
11279a2fd97dSFlorian Mayer; ABORT-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
1128be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW:       8:
11296e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 16)
1130be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    br label [[TMP9]]
1131be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW:       9:
11326e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    store i8 [[B]], ptr [[A]], align 4
11336e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    ret void
11346e8ce167SVitaly Buka;
11356e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store8
11366e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {
11376e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:
11386e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
11396e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
11406e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
11416e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
11426e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
11436e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
11446e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
11456e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
11466e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
11479a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
11486e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       8:
11496e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
11509a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
11516e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       10:
11526e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 112", "{x10}"(i64 [[TMP0]])
11536e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]
11546e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       11:
11556e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15
11566e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
11576e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 0
11586e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
11599a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
11606e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       16:
11616e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15
11626e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
11636e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
11646e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
11659a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
11666e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       21:
11676e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]
11686e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       22:
11696e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    store i8 [[B]], ptr [[A]], align 4
11706e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret void
11716e8ce167SVitaly Buka;
1172f8738212SAlexey Baturoentry:
1173f8738212SAlexey Baturo  store i8 %b, ptr %a, align 4
1174f8738212SAlexey Baturo  ret void
1175f8738212SAlexey Baturo}
1176f8738212SAlexey Baturo
1177f8738212SAlexey Baturodefine void @test_store16(ptr %a, i16 %b) sanitize_hwaddress {
1178bb637396SVitaly Buka; CHECK-LABEL: define void @test_store16
1179bb637396SVitaly Buka; CHECK-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {
1180bb637396SVitaly Buka; CHECK-NEXT:  entry:
1181bb637396SVitaly Buka; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1182bb637396SVitaly Buka; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1183bb637396SVitaly Buka; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1184bb637396SVitaly Buka; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1185bb637396SVitaly Buka; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1186be601928SVitaly Buka; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1187be601928SVitaly Buka; CHECK-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
1188be601928SVitaly Buka; CHECK-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
1189be601928SVitaly Buka; CHECK-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
1190be601928SVitaly Buka; CHECK-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
1191be601928SVitaly Buka; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
1192be601928SVitaly Buka; CHECK-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
1193be601928SVitaly Buka; CHECK-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
11949a2fd97dSFlorian Mayer; CHECK-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
1195be601928SVitaly Buka; CHECK:       12:
1196bb637396SVitaly Buka; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 17)
1197be601928SVitaly Buka; CHECK-NEXT:    br label [[TMP13]]
1198be601928SVitaly Buka; CHECK:       13:
1199bb637396SVitaly Buka; CHECK-NEXT:    store i16 [[B]], ptr [[A]], align 4
1200bb637396SVitaly Buka; CHECK-NEXT:    ret void
1201bb637396SVitaly Buka;
1202bb637396SVitaly Buka; NOFASTPATH-LABEL: define void @test_store16
1203bb637396SVitaly Buka; NOFASTPATH-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {
1204bb637396SVitaly Buka; NOFASTPATH-NEXT:  entry:
1205bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1206bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1207bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1208bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1209bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1210bb637396SVitaly Buka; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 17)
1211bb637396SVitaly Buka; NOFASTPATH-NEXT:    store i16 [[B]], ptr [[A]], align 4
1212bb637396SVitaly Buka; NOFASTPATH-NEXT:    ret void
1213bb637396SVitaly Buka;
1214bb637396SVitaly Buka; FASTPATH-LABEL: define void @test_store16
1215bb637396SVitaly Buka; FASTPATH-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {
1216bb637396SVitaly Buka; FASTPATH-NEXT:  entry:
1217bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1218bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1219bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1220bb637396SVitaly Buka; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1221bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1222be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1223be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
1224be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
1225be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
1226be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
1227be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
1228be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
1229be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
12309a2fd97dSFlorian Mayer; FASTPATH-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
1231be601928SVitaly Buka; FASTPATH:       12:
1232bb637396SVitaly Buka; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 17)
1233be601928SVitaly Buka; FASTPATH-NEXT:    br label [[TMP13]]
1234be601928SVitaly Buka; FASTPATH:       13:
1235bb637396SVitaly Buka; FASTPATH-NEXT:    store i16 [[B]], ptr [[A]], align 4
1236bb637396SVitaly Buka; FASTPATH-NEXT:    ret void
1237bb637396SVitaly Buka;
12386e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store16
12396e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {
12406e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:  entry:
12416e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
1242be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1243be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1244be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1245be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1246be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1247be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
1248be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1249be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
12509a2fd97dSFlorian Mayer; ABORT-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
1251be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW:       8:
12526e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 17)
1253be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    br label [[TMP9]]
1254be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW:       9:
12556e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    store i16 [[B]], ptr [[A]], align 4
12566e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    ret void
12576e8ce167SVitaly Buka;
12586e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store16
12596e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {
12606e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:
12616e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
12626e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
12636e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
12646e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
12656e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
12666e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
12676e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
12686e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
12696e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
12709a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
12716e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       8:
12726e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
12739a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
12746e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       10:
12756e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 113", "{x10}"(i64 [[TMP0]])
12766e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]
12776e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       11:
12786e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15
12796e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
12806e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 1
12816e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
12829a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
12836e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       16:
12846e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15
12856e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
12866e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
12876e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
12889a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
12896e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       21:
12906e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]
12916e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       22:
12926e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    store i16 [[B]], ptr [[A]], align 4
12936e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    ret void
12946e8ce167SVitaly Buka;
12956e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store16
12966e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {
12976e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:
12986e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
1299be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1300be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1301be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1302be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1303be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1304be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
1305be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1306be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
13079a2fd97dSFlorian Mayer; ABORT-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
1308be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW:       8:
13096e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 17)
1310be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    br label [[TMP9]]
1311be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW:       9:
13126e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    store i16 [[B]], ptr [[A]], align 4
13136e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    ret void
13146e8ce167SVitaly Buka;
13156e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store16
13166e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {
13176e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:
13186e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
13196e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
13206e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
13216e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
13226e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
13236e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
13246e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
13256e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
13266e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
13279a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
13286e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       8:
13296e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
13309a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
13316e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       10:
13326e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 113", "{x10}"(i64 [[TMP0]])
13336e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]
13346e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       11:
13356e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15
13366e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
13376e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 1
13386e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
13399a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
13406e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       16:
13416e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15
13426e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
13436e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
13446e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
13459a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
13466e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       21:
13476e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]
13486e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       22:
13496e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    store i16 [[B]], ptr [[A]], align 4
13506e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret void
13516e8ce167SVitaly Buka;
1352f8738212SAlexey Baturoentry:
1353f8738212SAlexey Baturo  store i16 %b, ptr %a, align 4
1354f8738212SAlexey Baturo  ret void
1355f8738212SAlexey Baturo}
1356f8738212SAlexey Baturo
1357f8738212SAlexey Baturodefine void @test_store32(ptr %a, i32 %b) sanitize_hwaddress {
1358bb637396SVitaly Buka; CHECK-LABEL: define void @test_store32
1359bb637396SVitaly Buka; CHECK-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {
1360bb637396SVitaly Buka; CHECK-NEXT:  entry:
1361bb637396SVitaly Buka; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1362bb637396SVitaly Buka; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1363bb637396SVitaly Buka; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1364bb637396SVitaly Buka; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1365bb637396SVitaly Buka; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1366be601928SVitaly Buka; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1367be601928SVitaly Buka; CHECK-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
1368be601928SVitaly Buka; CHECK-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
1369be601928SVitaly Buka; CHECK-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
1370be601928SVitaly Buka; CHECK-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
1371be601928SVitaly Buka; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
1372be601928SVitaly Buka; CHECK-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
1373be601928SVitaly Buka; CHECK-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
13749a2fd97dSFlorian Mayer; CHECK-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
1375be601928SVitaly Buka; CHECK:       12:
1376bb637396SVitaly Buka; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 18)
1377be601928SVitaly Buka; CHECK-NEXT:    br label [[TMP13]]
1378be601928SVitaly Buka; CHECK:       13:
1379bb637396SVitaly Buka; CHECK-NEXT:    store i32 [[B]], ptr [[A]], align 4
1380bb637396SVitaly Buka; CHECK-NEXT:    ret void
1381bb637396SVitaly Buka;
1382bb637396SVitaly Buka; NOFASTPATH-LABEL: define void @test_store32
1383bb637396SVitaly Buka; NOFASTPATH-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {
1384bb637396SVitaly Buka; NOFASTPATH-NEXT:  entry:
1385bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1386bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1387bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1388bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1389bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1390bb637396SVitaly Buka; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 18)
1391bb637396SVitaly Buka; NOFASTPATH-NEXT:    store i32 [[B]], ptr [[A]], align 4
1392bb637396SVitaly Buka; NOFASTPATH-NEXT:    ret void
1393bb637396SVitaly Buka;
1394bb637396SVitaly Buka; FASTPATH-LABEL: define void @test_store32
1395bb637396SVitaly Buka; FASTPATH-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {
1396bb637396SVitaly Buka; FASTPATH-NEXT:  entry:
1397bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1398bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1399bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1400bb637396SVitaly Buka; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1401bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1402be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1403be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
1404be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
1405be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
1406be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
1407be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
1408be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
1409be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
14109a2fd97dSFlorian Mayer; FASTPATH-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
1411be601928SVitaly Buka; FASTPATH:       12:
1412bb637396SVitaly Buka; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 18)
1413be601928SVitaly Buka; FASTPATH-NEXT:    br label [[TMP13]]
1414be601928SVitaly Buka; FASTPATH:       13:
1415bb637396SVitaly Buka; FASTPATH-NEXT:    store i32 [[B]], ptr [[A]], align 4
1416bb637396SVitaly Buka; FASTPATH-NEXT:    ret void
1417bb637396SVitaly Buka;
14186e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store32
14196e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {
14206e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:  entry:
14216e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
1422be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1423be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1424be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1425be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1426be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1427be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
1428be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1429be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
14309a2fd97dSFlorian Mayer; ABORT-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
1431be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW:       8:
14326e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 18)
1433be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    br label [[TMP9]]
1434be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW:       9:
14356e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    store i32 [[B]], ptr [[A]], align 4
14366e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    ret void
14376e8ce167SVitaly Buka;
14386e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store32
14396e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {
14406e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:
14416e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
14426e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
14436e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
14446e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
14456e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
14466e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
14476e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
14486e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
14496e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
14509a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
14516e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       8:
14526e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
14539a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
14546e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       10:
14556e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 114", "{x10}"(i64 [[TMP0]])
14566e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]
14576e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       11:
14586e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15
14596e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
14606e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 3
14616e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
14629a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
14636e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       16:
14646e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15
14656e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
14666e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
14676e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
14689a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
14696e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       21:
14706e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]
14716e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       22:
14726e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    store i32 [[B]], ptr [[A]], align 4
14736e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    ret void
14746e8ce167SVitaly Buka;
14756e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store32
14766e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {
14776e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:
14786e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
1479be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1480be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1481be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1482be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1483be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1484be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
1485be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1486be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
14879a2fd97dSFlorian Mayer; ABORT-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
1488be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW:       8:
14896e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 18)
1490be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    br label [[TMP9]]
1491be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW:       9:
14926e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    store i32 [[B]], ptr [[A]], align 4
14936e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    ret void
14946e8ce167SVitaly Buka;
14956e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store32
14966e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {
14976e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:
14986e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
14996e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
15006e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
15016e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
15026e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
15036e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
15046e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
15056e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
15066e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
15079a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
15086e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       8:
15096e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
15109a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
15116e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       10:
15126e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 114", "{x10}"(i64 [[TMP0]])
15136e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]
15146e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       11:
15156e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15
15166e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
15176e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 3
15186e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
15199a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
15206e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       16:
15216e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15
15226e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
15236e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
15246e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
15259a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
15266e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       21:
15276e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]
15286e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       22:
15296e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    store i32 [[B]], ptr [[A]], align 4
15306e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret void
15316e8ce167SVitaly Buka;
1532f8738212SAlexey Baturoentry:
1533f8738212SAlexey Baturo  store i32 %b, ptr %a, align 4
1534f8738212SAlexey Baturo  ret void
1535f8738212SAlexey Baturo}
1536f8738212SAlexey Baturo
1537f8738212SAlexey Baturodefine void @test_store64(ptr %a, i64 %b) sanitize_hwaddress {
1538bb637396SVitaly Buka; CHECK-LABEL: define void @test_store64
1539bb637396SVitaly Buka; CHECK-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
1540bb637396SVitaly Buka; CHECK-NEXT:  entry:
1541bb637396SVitaly Buka; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1542bb637396SVitaly Buka; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1543bb637396SVitaly Buka; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1544bb637396SVitaly Buka; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1545bb637396SVitaly Buka; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1546be601928SVitaly Buka; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1547be601928SVitaly Buka; CHECK-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
1548be601928SVitaly Buka; CHECK-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
1549be601928SVitaly Buka; CHECK-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
1550be601928SVitaly Buka; CHECK-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
1551be601928SVitaly Buka; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
1552be601928SVitaly Buka; CHECK-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
1553be601928SVitaly Buka; CHECK-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
15549a2fd97dSFlorian Mayer; CHECK-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
1555be601928SVitaly Buka; CHECK:       12:
1556bb637396SVitaly Buka; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 19)
1557be601928SVitaly Buka; CHECK-NEXT:    br label [[TMP13]]
1558be601928SVitaly Buka; CHECK:       13:
1559bb637396SVitaly Buka; CHECK-NEXT:    store i64 [[B]], ptr [[A]], align 8
1560bb637396SVitaly Buka; CHECK-NEXT:    ret void
1561bb637396SVitaly Buka;
1562bb637396SVitaly Buka; NOFASTPATH-LABEL: define void @test_store64
1563bb637396SVitaly Buka; NOFASTPATH-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
1564bb637396SVitaly Buka; NOFASTPATH-NEXT:  entry:
1565bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1566bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1567bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1568bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1569bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1570bb637396SVitaly Buka; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 19)
1571bb637396SVitaly Buka; NOFASTPATH-NEXT:    store i64 [[B]], ptr [[A]], align 8
1572bb637396SVitaly Buka; NOFASTPATH-NEXT:    ret void
1573bb637396SVitaly Buka;
1574bb637396SVitaly Buka; FASTPATH-LABEL: define void @test_store64
1575bb637396SVitaly Buka; FASTPATH-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
1576bb637396SVitaly Buka; FASTPATH-NEXT:  entry:
1577bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1578bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1579bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1580bb637396SVitaly Buka; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1581bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1582be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1583be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
1584be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
1585be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
1586be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
1587be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
1588be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
1589be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
15909a2fd97dSFlorian Mayer; FASTPATH-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
1591be601928SVitaly Buka; FASTPATH:       12:
1592bb637396SVitaly Buka; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 19)
1593be601928SVitaly Buka; FASTPATH-NEXT:    br label [[TMP13]]
1594be601928SVitaly Buka; FASTPATH:       13:
1595bb637396SVitaly Buka; FASTPATH-NEXT:    store i64 [[B]], ptr [[A]], align 8
1596bb637396SVitaly Buka; FASTPATH-NEXT:    ret void
1597bb637396SVitaly Buka;
15986e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store64
15996e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
16006e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:  entry:
16016e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
1602be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1603be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1604be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1605be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1606be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1607be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
1608be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1609be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
16109a2fd97dSFlorian Mayer; ABORT-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
1611be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW:       8:
16126e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 19)
1613be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    br label [[TMP9]]
1614be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW:       9:
16156e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    store i64 [[B]], ptr [[A]], align 8
16166e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    ret void
16176e8ce167SVitaly Buka;
16186e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store64
16196e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
16206e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:
16216e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
16226e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
16236e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
16246e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
16256e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
16266e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
16276e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
16286e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
16296e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
16309a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
16316e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       8:
16326e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
16339a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
16346e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       10:
16356e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 115", "{x10}"(i64 [[TMP0]])
16366e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]
16376e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       11:
16386e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15
16396e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
16406e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 7
16416e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
16429a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
16436e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       16:
16446e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15
16456e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
16466e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
16476e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
16489a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
16496e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       21:
16506e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]
16516e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       22:
16526e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    store i64 [[B]], ptr [[A]], align 8
16536e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    ret void
16546e8ce167SVitaly Buka;
16556e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store64
16566e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
16576e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:
16586e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
1659be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1660be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1661be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1662be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1663be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1664be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
1665be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1666be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
16679a2fd97dSFlorian Mayer; ABORT-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
1668be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW:       8:
16696e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 19)
1670be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    br label [[TMP9]]
1671be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW:       9:
16726e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    store i64 [[B]], ptr [[A]], align 8
16736e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    ret void
16746e8ce167SVitaly Buka;
16756e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store64
16766e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
16776e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:
16786e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
16796e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
16806e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
16816e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
16826e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
16836e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
16846e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
16856e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
16866e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
16879a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
16886e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       8:
16896e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
16909a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
16916e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       10:
16926e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 115", "{x10}"(i64 [[TMP0]])
16936e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]
16946e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       11:
16956e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15
16966e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
16976e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 7
16986e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
16999a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
17006e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       16:
17016e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15
17026e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
17036e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
17046e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
17059a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
17066e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       21:
17076e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]
17086e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       22:
17096e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    store i64 [[B]], ptr [[A]], align 8
17106e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret void
17116e8ce167SVitaly Buka;
1712f8738212SAlexey Baturoentry:
1713f8738212SAlexey Baturo  store i64 %b, ptr %a, align 8
1714f8738212SAlexey Baturo  ret void
1715f8738212SAlexey Baturo}
1716f8738212SAlexey Baturo
1717f8738212SAlexey Baturodefine void @test_store128(ptr %a, i128 %b) sanitize_hwaddress {
1718bb637396SVitaly Buka; CHECK-LABEL: define void @test_store128
1719bb637396SVitaly Buka; CHECK-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {
1720bb637396SVitaly Buka; CHECK-NEXT:  entry:
1721bb637396SVitaly Buka; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1722bb637396SVitaly Buka; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1723bb637396SVitaly Buka; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1724bb637396SVitaly Buka; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1725bb637396SVitaly Buka; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1726be601928SVitaly Buka; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1727be601928SVitaly Buka; CHECK-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
1728be601928SVitaly Buka; CHECK-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
1729be601928SVitaly Buka; CHECK-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
1730be601928SVitaly Buka; CHECK-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
1731be601928SVitaly Buka; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
1732be601928SVitaly Buka; CHECK-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
1733be601928SVitaly Buka; CHECK-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
17349a2fd97dSFlorian Mayer; CHECK-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
1735be601928SVitaly Buka; CHECK:       12:
1736bb637396SVitaly Buka; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 20)
1737be601928SVitaly Buka; CHECK-NEXT:    br label [[TMP13]]
1738be601928SVitaly Buka; CHECK:       13:
1739bb637396SVitaly Buka; CHECK-NEXT:    store i128 [[B]], ptr [[A]], align 16
1740bb637396SVitaly Buka; CHECK-NEXT:    ret void
1741bb637396SVitaly Buka;
1742bb637396SVitaly Buka; NOFASTPATH-LABEL: define void @test_store128
1743bb637396SVitaly Buka; NOFASTPATH-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {
1744bb637396SVitaly Buka; NOFASTPATH-NEXT:  entry:
1745bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1746bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1747bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1748bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1749bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1750bb637396SVitaly Buka; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 20)
1751bb637396SVitaly Buka; NOFASTPATH-NEXT:    store i128 [[B]], ptr [[A]], align 16
1752bb637396SVitaly Buka; NOFASTPATH-NEXT:    ret void
1753bb637396SVitaly Buka;
1754bb637396SVitaly Buka; FASTPATH-LABEL: define void @test_store128
1755bb637396SVitaly Buka; FASTPATH-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {
1756bb637396SVitaly Buka; FASTPATH-NEXT:  entry:
1757bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1758bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1759bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1760bb637396SVitaly Buka; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1761bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1762be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1763be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56
1764be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
1765be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935
1766be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4
1767be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]
1768be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1
1769be601928SVitaly Buka; FASTPATH-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]
17709a2fd97dSFlorian Mayer; FASTPATH-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]
1771be601928SVitaly Buka; FASTPATH:       12:
1772bb637396SVitaly Buka; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 20)
1773be601928SVitaly Buka; FASTPATH-NEXT:    br label [[TMP13]]
1774be601928SVitaly Buka; FASTPATH:       13:
1775bb637396SVitaly Buka; FASTPATH-NEXT:    store i128 [[B]], ptr [[A]], align 16
1776bb637396SVitaly Buka; FASTPATH-NEXT:    ret void
1777bb637396SVitaly Buka;
17786e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store128
17796e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {
17806e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:  entry:
17816e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
1782be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1783be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1784be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1785be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1786be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1787be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
1788be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1789be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
17909a2fd97dSFlorian Mayer; ABORT-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
1791be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW:       8:
17926e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 20)
1793be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    br label [[TMP9]]
1794be601928SVitaly Buka; ABORT-DYNAMIC-SHADOW:       9:
17956e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    store i128 [[B]], ptr [[A]], align 16
17966e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    ret void
17976e8ce167SVitaly Buka;
17986e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store128
17996e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {
18006e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:
18016e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
18026e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
18036e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
18046e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
18056e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
18066e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
18076e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]
18086e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
18096e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
18109a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
18116e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       8:
18126e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
18139a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
18146e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       10:
18156e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 116", "{x10}"(i64 [[TMP0]])
18166e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]
18176e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       11:
18186e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15
18196e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
18206e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 15
18216e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
18229a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
18236e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       16:
18246e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15
18256e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
18266e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
18276e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
18289a2fd97dSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
18296e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       21:
18306e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]
18316e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW:       22:
18326e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    store i128 [[B]], ptr [[A]], align 16
18336e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    ret void
18346e8ce167SVitaly Buka;
18356e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store128
18366e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {
18376e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:
18386e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
1839be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
1840be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
1841be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
1842be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
1843be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
1844be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
1845be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
1846be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
18479a2fd97dSFlorian Mayer; ABORT-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]
1848be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW:       8:
18496e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 20)
1850be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    br label [[TMP9]]
1851be601928SVitaly Buka; ABORT-ZERO-BASED-SHADOW:       9:
18526e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    store i128 [[B]], ptr [[A]], align 16
18536e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    ret void
18546e8ce167SVitaly Buka;
18556e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store128
18566e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {
18576e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:
18586e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
18596e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
18606e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56
18616e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8
18626e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935
18636e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4
18646e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
18656e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1
18666e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]
18679a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]
18686e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       8:
18696e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15
18709a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]
18716e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       10:
18726e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 116", "{x10}"(i64 [[TMP0]])
18736e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]
18746e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       11:
18756e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15
18766e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8
18776e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 15
18786e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]
18799a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]
18806e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       16:
18816e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15
18826e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
18836e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1
18846e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]
18859a2fd97dSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]
18866e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       21:
18876e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]
18886e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW:       22:
18896e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    store i128 [[B]], ptr [[A]], align 16
18906e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret void
18916e8ce167SVitaly Buka;
1892f8738212SAlexey Baturoentry:
1893f8738212SAlexey Baturo  store i128 %b, ptr %a, align 16
1894f8738212SAlexey Baturo  ret void
1895f8738212SAlexey Baturo}
1896f8738212SAlexey Baturo
1897f8738212SAlexey Baturodefine void @test_store40(ptr %a, i40 %b) sanitize_hwaddress {
1898bb637396SVitaly Buka; CHECK-LABEL: define void @test_store40
1899bb637396SVitaly Buka; CHECK-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {
1900bb637396SVitaly Buka; CHECK-NEXT:  entry:
1901bb637396SVitaly Buka; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1902bb637396SVitaly Buka; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1903bb637396SVitaly Buka; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1904bb637396SVitaly Buka; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1905bb637396SVitaly Buka; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1906bb637396SVitaly Buka; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1907bb637396SVitaly Buka; CHECK-NEXT:    call void @__hwasan_storeN(i64 [[TMP4]], i64 5)
1908bb637396SVitaly Buka; CHECK-NEXT:    store i40 [[B]], ptr [[A]], align 4
1909bb637396SVitaly Buka; CHECK-NEXT:    ret void
1910bb637396SVitaly Buka;
1911bb637396SVitaly Buka; NOFASTPATH-LABEL: define void @test_store40
1912bb637396SVitaly Buka; NOFASTPATH-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {
1913bb637396SVitaly Buka; NOFASTPATH-NEXT:  entry:
1914bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1915bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1916bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1917bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1918bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1919bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1920bb637396SVitaly Buka; NOFASTPATH-NEXT:    call void @__hwasan_storeN(i64 [[TMP4]], i64 5)
1921bb637396SVitaly Buka; NOFASTPATH-NEXT:    store i40 [[B]], ptr [[A]], align 4
1922bb637396SVitaly Buka; NOFASTPATH-NEXT:    ret void
1923bb637396SVitaly Buka;
1924bb637396SVitaly Buka; FASTPATH-LABEL: define void @test_store40
1925bb637396SVitaly Buka; FASTPATH-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {
1926bb637396SVitaly Buka; FASTPATH-NEXT:  entry:
1927bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1928bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1929bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1930bb637396SVitaly Buka; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1931bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1932bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1933bb637396SVitaly Buka; FASTPATH-NEXT:    call void @__hwasan_storeN(i64 [[TMP4]], i64 5)
1934bb637396SVitaly Buka; FASTPATH-NEXT:    store i40 [[B]], ptr [[A]], align 4
1935bb637396SVitaly Buka; FASTPATH-NEXT:    ret void
1936bb637396SVitaly Buka;
19376e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store40
19386e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {
19396e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:  entry:
19406e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
19416e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
19426e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    call void @__hwasan_storeN(i64 [[TMP0]], i64 5)
19436e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    store i40 [[B]], ptr [[A]], align 4
19446e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    ret void
19456e8ce167SVitaly Buka;
19466e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store40
19476e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {
19486e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:
19496e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
19506e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
19516e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    call void @__hwasan_storeN_noabort(i64 [[TMP0]], i64 5)
19526e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    store i40 [[B]], ptr [[A]], align 4
19536e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    ret void
19546e8ce167SVitaly Buka;
19556e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store40
19566e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {
19576e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:
19586e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
19596e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
19606e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @__hwasan_storeN(i64 [[TMP0]], i64 5)
19616e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    store i40 [[B]], ptr [[A]], align 4
19626e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    ret void
19636e8ce167SVitaly Buka;
19646e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store40
19656e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {
19666e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:
19676e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
19686e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
19696e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void @__hwasan_storeN_noabort(i64 [[TMP0]], i64 5)
19706e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    store i40 [[B]], ptr [[A]], align 4
19716e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret void
19726e8ce167SVitaly Buka;
1973f8738212SAlexey Baturoentry:
1974f8738212SAlexey Baturo  store i40 %b, ptr %a, align 4
1975f8738212SAlexey Baturo  ret void
1976f8738212SAlexey Baturo}
1977f8738212SAlexey Baturo
1978f8738212SAlexey Baturodefine void @test_store_unaligned(ptr %a, i64 %b) sanitize_hwaddress {
1979bb637396SVitaly Buka; CHECK-LABEL: define void @test_store_unaligned
1980bb637396SVitaly Buka; CHECK-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
1981bb637396SVitaly Buka; CHECK-NEXT:  entry:
1982bb637396SVitaly Buka; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1983bb637396SVitaly Buka; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1984bb637396SVitaly Buka; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1985bb637396SVitaly Buka; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1986bb637396SVitaly Buka; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
1987bb637396SVitaly Buka; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
1988bb637396SVitaly Buka; CHECK-NEXT:    call void @__hwasan_storeN(i64 [[TMP4]], i64 8)
1989bb637396SVitaly Buka; CHECK-NEXT:    store i64 [[B]], ptr [[A]], align 4
1990bb637396SVitaly Buka; CHECK-NEXT:    ret void
1991bb637396SVitaly Buka;
1992bb637396SVitaly Buka; NOFASTPATH-LABEL: define void @test_store_unaligned
1993bb637396SVitaly Buka; NOFASTPATH-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
1994bb637396SVitaly Buka; NOFASTPATH-NEXT:  entry:
1995bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
1996bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
1997bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
1998bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
1999bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
2000bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
2001bb637396SVitaly Buka; NOFASTPATH-NEXT:    call void @__hwasan_storeN(i64 [[TMP4]], i64 8)
2002bb637396SVitaly Buka; NOFASTPATH-NEXT:    store i64 [[B]], ptr [[A]], align 4
2003bb637396SVitaly Buka; NOFASTPATH-NEXT:    ret void
2004bb637396SVitaly Buka;
2005bb637396SVitaly Buka; FASTPATH-LABEL: define void @test_store_unaligned
2006bb637396SVitaly Buka; FASTPATH-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
2007bb637396SVitaly Buka; FASTPATH-NEXT:  entry:
2008bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8
2009bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935
2010bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295
2011bb637396SVitaly Buka; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1
2012bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr
2013bb637396SVitaly Buka; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64
2014bb637396SVitaly Buka; FASTPATH-NEXT:    call void @__hwasan_storeN(i64 [[TMP4]], i64 8)
2015bb637396SVitaly Buka; FASTPATH-NEXT:    store i64 [[B]], ptr [[A]], align 4
2016bb637396SVitaly Buka; FASTPATH-NEXT:    ret void
2017bb637396SVitaly Buka;
20186e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store_unaligned
20196e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
20206e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:  entry:
20216e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
20226e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
20236e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    call void @__hwasan_storeN(i64 [[TMP0]], i64 8)
20246e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    store i64 [[B]], ptr [[A]], align 4
20256e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    ret void
20266e8ce167SVitaly Buka;
20276e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store_unaligned
20286e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
20296e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:
20306e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
20316e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
20326e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    call void @__hwasan_storeN_noabort(i64 [[TMP0]], i64 8)
20336e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    store i64 [[B]], ptr [[A]], align 4
20346e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    ret void
20356e8ce167SVitaly Buka;
20366e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store_unaligned
20376e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
20386e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:
20396e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
20406e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
20416e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @__hwasan_storeN(i64 [[TMP0]], i64 8)
20426e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    store i64 [[B]], ptr [[A]], align 4
20436e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    ret void
20446e8ce167SVitaly Buka;
20456e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store_unaligned
20466e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
20476e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:
20486e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)
20496e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64
20506e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void @__hwasan_storeN_noabort(i64 [[TMP0]], i64 8)
20516e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    store i64 [[B]], ptr [[A]], align 4
20526e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret void
20536e8ce167SVitaly Buka;
2054f8738212SAlexey Baturoentry:
2055f8738212SAlexey Baturo  store i64 %b, ptr %a, align 4
2056f8738212SAlexey Baturo  ret void
2057f8738212SAlexey Baturo}
2058f8738212SAlexey Baturo
2059f8738212SAlexey Baturodefine i8 @test_load_noattr(ptr %a) {
20606e8ce167SVitaly Buka; CHECK-LABEL: define i8 @test_load_noattr
2061f81f283bSFlorian Mayer; CHECK-SAME: (ptr [[A:%.*]]) {
2062f8738212SAlexey Baturo; CHECK-NEXT:  entry:
20636e8ce167SVitaly Buka; CHECK-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4
20646e8ce167SVitaly Buka; CHECK-NEXT:    ret i8 [[B]]
20656e8ce167SVitaly Buka;
2066bb637396SVitaly Buka; NOFASTPATH-LABEL: define i8 @test_load_noattr
2067f81f283bSFlorian Mayer; NOFASTPATH-SAME: (ptr [[A:%.*]]) {
2068bb637396SVitaly Buka; NOFASTPATH-NEXT:  entry:
2069bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4
2070bb637396SVitaly Buka; NOFASTPATH-NEXT:    ret i8 [[B]]
2071bb637396SVitaly Buka;
2072bb637396SVitaly Buka; FASTPATH-LABEL: define i8 @test_load_noattr
2073f81f283bSFlorian Mayer; FASTPATH-SAME: (ptr [[A:%.*]]) {
2074bb637396SVitaly Buka; FASTPATH-NEXT:  entry:
2075bb637396SVitaly Buka; FASTPATH-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4
2076bb637396SVitaly Buka; FASTPATH-NEXT:    ret i8 [[B]]
2077bb637396SVitaly Buka;
20786e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-LABEL: define i8 @test_load_noattr
2079f81f283bSFlorian Mayer; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) {
20806e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:  entry:
20816e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4
20826e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    ret i8 [[B]]
20836e8ce167SVitaly Buka;
20846e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-LABEL: define i8 @test_load_noattr
2085f81f283bSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) {
20866e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:
20876e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4
20886e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i8 [[B]]
20896e8ce167SVitaly Buka;
20906e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-LABEL: define i8 @test_load_noattr
2091f81f283bSFlorian Mayer; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) {
20926e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:
20936e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4
20946e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i8 [[B]]
20956e8ce167SVitaly Buka;
20966e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-LABEL: define i8 @test_load_noattr
2097f81f283bSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) {
20986e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:
20996e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4
21006e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i8 [[B]]
21016e8ce167SVitaly Buka;
2102f8738212SAlexey Baturoentry:
2103f8738212SAlexey Baturo  %b = load i8, ptr %a, align 4
2104f8738212SAlexey Baturo  ret i8 %b
2105f8738212SAlexey Baturo}
2106f8738212SAlexey Baturo
2107f8738212SAlexey Baturodefine i8 @test_load_notmyattr(ptr %a) sanitize_address {
21086e8ce167SVitaly Buka; CHECK-LABEL: define i8 @test_load_notmyattr
2109f81f283bSFlorian Mayer; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {
2110f8738212SAlexey Baturo; CHECK-NEXT:  entry:
21116e8ce167SVitaly Buka; CHECK-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4
21126e8ce167SVitaly Buka; CHECK-NEXT:    ret i8 [[B]]
21136e8ce167SVitaly Buka;
2114bb637396SVitaly Buka; NOFASTPATH-LABEL: define i8 @test_load_notmyattr
2115f81f283bSFlorian Mayer; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {
2116bb637396SVitaly Buka; NOFASTPATH-NEXT:  entry:
2117bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4
2118bb637396SVitaly Buka; NOFASTPATH-NEXT:    ret i8 [[B]]
2119bb637396SVitaly Buka;
2120bb637396SVitaly Buka; FASTPATH-LABEL: define i8 @test_load_notmyattr
2121f81f283bSFlorian Mayer; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {
2122bb637396SVitaly Buka; FASTPATH-NEXT:  entry:
2123bb637396SVitaly Buka; FASTPATH-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4
2124bb637396SVitaly Buka; FASTPATH-NEXT:    ret i8 [[B]]
2125bb637396SVitaly Buka;
21266e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-LABEL: define i8 @test_load_notmyattr
2127f81f283bSFlorian Mayer; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {
21286e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:  entry:
21296e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4
21306e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    ret i8 [[B]]
21316e8ce167SVitaly Buka;
21326e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-LABEL: define i8 @test_load_notmyattr
2133f81f283bSFlorian Mayer; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {
21346e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:
21356e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4
21366e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i8 [[B]]
21376e8ce167SVitaly Buka;
21386e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-LABEL: define i8 @test_load_notmyattr
2139f81f283bSFlorian Mayer; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {
21406e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:
21416e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4
21426e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i8 [[B]]
21436e8ce167SVitaly Buka;
21446e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-LABEL: define i8 @test_load_notmyattr
2145f81f283bSFlorian Mayer; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {
21466e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:
21476e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4
21486e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i8 [[B]]
21496e8ce167SVitaly Buka;
2150f8738212SAlexey Baturoentry:
2151f8738212SAlexey Baturo  %b = load i8, ptr %a, align 4
2152f8738212SAlexey Baturo  ret i8 %b
2153f8738212SAlexey Baturo}
2154f8738212SAlexey Baturo
2155f8738212SAlexey Baturodefine i8 @test_load_addrspace(ptr addrspace(256) %a) sanitize_hwaddress {
21566e8ce167SVitaly Buka; CHECK-LABEL: define i8 @test_load_addrspace
2157bb637396SVitaly Buka; CHECK-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {
2158f8738212SAlexey Baturo; CHECK-NEXT:  entry:
21596e8ce167SVitaly Buka; CHECK-NEXT:    [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 4
21606e8ce167SVitaly Buka; CHECK-NEXT:    ret i8 [[B]]
21616e8ce167SVitaly Buka;
2162bb637396SVitaly Buka; NOFASTPATH-LABEL: define i8 @test_load_addrspace
2163bb637396SVitaly Buka; NOFASTPATH-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {
2164bb637396SVitaly Buka; NOFASTPATH-NEXT:  entry:
2165bb637396SVitaly Buka; NOFASTPATH-NEXT:    [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 4
2166bb637396SVitaly Buka; NOFASTPATH-NEXT:    ret i8 [[B]]
2167bb637396SVitaly Buka;
2168bb637396SVitaly Buka; FASTPATH-LABEL: define i8 @test_load_addrspace
2169bb637396SVitaly Buka; FASTPATH-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {
2170bb637396SVitaly Buka; FASTPATH-NEXT:  entry:
2171bb637396SVitaly Buka; FASTPATH-NEXT:    [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 4
2172bb637396SVitaly Buka; FASTPATH-NEXT:    ret i8 [[B]]
2173bb637396SVitaly Buka;
21746e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-LABEL: define i8 @test_load_addrspace
21756e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {
21766e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:  entry:
21776e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 4
21786e8ce167SVitaly Buka; ABORT-DYNAMIC-SHADOW-NEXT:    ret i8 [[B]]
21796e8ce167SVitaly Buka;
21806e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-LABEL: define i8 @test_load_addrspace
21816e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {
21826e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:
21836e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 4
21846e8ce167SVitaly Buka; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i8 [[B]]
21856e8ce167SVitaly Buka;
21866e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-LABEL: define i8 @test_load_addrspace
21876e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {
21886e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:
21896e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 4
21906e8ce167SVitaly Buka; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i8 [[B]]
21916e8ce167SVitaly Buka;
21926e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-LABEL: define i8 @test_load_addrspace
21936e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {
21946e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:
21956e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 4
21966e8ce167SVitaly Buka; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i8 [[B]]
21976e8ce167SVitaly Buka;
2198f8738212SAlexey Baturoentry:
2199f8738212SAlexey Baturo  %b = load i8, ptr addrspace(256) %a, align 4
2200f8738212SAlexey Baturo  ret i8 %b
2201f8738212SAlexey Baturo}
2202f8738212SAlexey Baturo
2203