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