brintos

brintos / llvm-project-archived public Read only

0
0
Text · 130.9 KiB · e0eb111 Raw
2203 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 22; Test basic address sanitizer instrumentation.3;4; RUN: opt < %s -passes=hwasan -S | FileCheck %s5; RUN: opt < %s -passes=hwasan -hwasan-inline-fast-path-checks=0 -S | FileCheck %s --check-prefixes=NOFASTPATH6; RUN: opt < %s -passes=hwasan -hwasan-inline-fast-path-checks=1 -S | FileCheck %s --check-prefixes=FASTPATH7; RUN: opt < %s -passes=hwasan -hwasan-recover=0 -hwasan-mapping-offset-dynamic=ifunc -S | FileCheck %s --check-prefixes=ABORT-DYNAMIC-SHADOW8; RUN: opt < %s -passes=hwasan -hwasan-recover=1 -hwasan-mapping-offset-dynamic=ifunc -S | FileCheck %s --check-prefixes=RECOVER-DYNAMIC-SHADOW9; RUN: opt < %s -passes=hwasan -hwasan-recover=0 -hwasan-mapping-offset=0 -S | FileCheck %s --check-prefixes=ABORT-ZERO-BASED-SHADOW10; RUN: opt < %s -passes=hwasan -hwasan-recover=1 -hwasan-mapping-offset=0 -S | FileCheck %s --check-prefixes=RECOVER-ZERO-BASED-SHADOW11 12 13target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"14target triple = "riscv64-unknown-linux"15 16define i8 @test_load8(ptr %a) sanitize_hwaddress {17; CHECK-LABEL: define i8 @test_load818; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {19; CHECK-NEXT:  entry:20; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 821; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 7205759403792793522; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 429496729523; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 124; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr25; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i6426; CHECK-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 5627; CHECK-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i828; CHECK-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 7205759403792793529; CHECK-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 430; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]31; CHECK-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 132; CHECK-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]33; CHECK-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2:![0-9]+]]34; CHECK:       12:35; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 0)36; CHECK-NEXT:    br label [[TMP13]]37; CHECK:       13:38; CHECK-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 439; CHECK-NEXT:    ret i8 [[B]]40;41; NOFASTPATH-LABEL: define i8 @test_load842; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {43; NOFASTPATH-NEXT:  entry:44; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 845; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 7205759403792793546; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 429496729547; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 148; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr49; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 0)50; NOFASTPATH-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 451; NOFASTPATH-NEXT:    ret i8 [[B]]52;53; FASTPATH-LABEL: define i8 @test_load854; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {55; FASTPATH-NEXT:  entry:56; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 857; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 7205759403792793558; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 429496729559; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 160; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr61; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i6462; FASTPATH-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 5663; FASTPATH-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i864; FASTPATH-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 7205759403792793565; FASTPATH-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 466; FASTPATH-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]67; FASTPATH-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 168; FASTPATH-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]69; FASTPATH-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2:![0-9]+]]70; FASTPATH:       12:71; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 0)72; FASTPATH-NEXT:    br label [[TMP13]]73; FASTPATH:       13:74; FASTPATH-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 475; FASTPATH-NEXT:    ret i8 [[B]]76;77; ABORT-DYNAMIC-SHADOW-LABEL: define i8 @test_load878; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {79; ABORT-DYNAMIC-SHADOW-NEXT:  entry:80; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)81; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i6482; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 5683; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i884; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 7205759403792793585; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 486; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]87; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 188; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]89; ABORT-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2:![0-9]+]]90; ABORT-DYNAMIC-SHADOW:       8:91; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 0)92; ABORT-DYNAMIC-SHADOW-NEXT:    br label [[TMP9]]93; ABORT-DYNAMIC-SHADOW:       9:94; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 495; ABORT-DYNAMIC-SHADOW-NEXT:    ret i8 [[B]]96;97; RECOVER-DYNAMIC-SHADOW-LABEL: define i8 @test_load898; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {99; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:100; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)101; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64102; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56103; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8104; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935105; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4106; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]107; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1108; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]109; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2:![0-9]+]]110; RECOVER-DYNAMIC-SHADOW:       8:111; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15112; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]113; RECOVER-DYNAMIC-SHADOW:       10:114; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 96", "{x10}"(i64 [[TMP0]])115; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]116; RECOVER-DYNAMIC-SHADOW:       11:117; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15118; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8119; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 0120; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]121; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]122; RECOVER-DYNAMIC-SHADOW:       16:123; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15124; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr125; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1126; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]127; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]128; RECOVER-DYNAMIC-SHADOW:       21:129; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]130; RECOVER-DYNAMIC-SHADOW:       22:131; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4132; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i8 [[B]]133;134; ABORT-ZERO-BASED-SHADOW-LABEL: define i8 @test_load8135; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {136; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:137; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)138; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64139; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56140; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8141; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935142; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4143; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr144; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1145; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]146; ABORT-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2:![0-9]+]]147; ABORT-ZERO-BASED-SHADOW:       8:148; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 0)149; ABORT-ZERO-BASED-SHADOW-NEXT:    br label [[TMP9]]150; ABORT-ZERO-BASED-SHADOW:       9:151; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4152; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i8 [[B]]153;154; RECOVER-ZERO-BASED-SHADOW-LABEL: define i8 @test_load8155; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {156; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:157; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)158; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64159; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56160; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8161; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935162; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4163; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr164; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1165; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]166; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2:![0-9]+]]167; RECOVER-ZERO-BASED-SHADOW:       8:168; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15169; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]170; RECOVER-ZERO-BASED-SHADOW:       10:171; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 96", "{x10}"(i64 [[TMP0]])172; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]173; RECOVER-ZERO-BASED-SHADOW:       11:174; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15175; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8176; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 0177; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]178; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]179; RECOVER-ZERO-BASED-SHADOW:       16:180; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15181; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr182; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1183; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]184; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]185; RECOVER-ZERO-BASED-SHADOW:       21:186; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]187; RECOVER-ZERO-BASED-SHADOW:       22:188; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4189; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i8 [[B]]190;191entry:192  %b = load i8, ptr %a, align 4193  ret i8 %b194}195 196define i16 @test_load16(ptr %a) sanitize_hwaddress {197; CHECK-LABEL: define i16 @test_load16198; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {199; CHECK-NEXT:  entry:200; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8201; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935202; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295203; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1204; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr205; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64206; CHECK-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56207; CHECK-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8208; CHECK-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935209; CHECK-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4210; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]211; CHECK-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1212; CHECK-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]213; CHECK-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]214; CHECK:       12:215; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 1)216; CHECK-NEXT:    br label [[TMP13]]217; CHECK:       13:218; CHECK-NEXT:    [[B:%.*]] = load i16, ptr [[A]], align 4219; CHECK-NEXT:    ret i16 [[B]]220;221; NOFASTPATH-LABEL: define i16 @test_load16222; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {223; NOFASTPATH-NEXT:  entry:224; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8225; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935226; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295227; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1228; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr229; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 1)230; NOFASTPATH-NEXT:    [[B:%.*]] = load i16, ptr [[A]], align 4231; NOFASTPATH-NEXT:    ret i16 [[B]]232;233; FASTPATH-LABEL: define i16 @test_load16234; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {235; FASTPATH-NEXT:  entry:236; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8237; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935238; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295239; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1240; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr241; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64242; FASTPATH-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56243; FASTPATH-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8244; FASTPATH-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935245; FASTPATH-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4246; FASTPATH-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]247; FASTPATH-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1248; FASTPATH-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]249; FASTPATH-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]250; FASTPATH:       12:251; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 1)252; FASTPATH-NEXT:    br label [[TMP13]]253; FASTPATH:       13:254; FASTPATH-NEXT:    [[B:%.*]] = load i16, ptr [[A]], align 4255; FASTPATH-NEXT:    ret i16 [[B]]256;257; ABORT-DYNAMIC-SHADOW-LABEL: define i16 @test_load16258; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {259; ABORT-DYNAMIC-SHADOW-NEXT:  entry:260; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)261; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64262; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56263; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8264; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935265; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4266; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]267; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1268; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]269; ABORT-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]270; ABORT-DYNAMIC-SHADOW:       8:271; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 1)272; ABORT-DYNAMIC-SHADOW-NEXT:    br label [[TMP9]]273; ABORT-DYNAMIC-SHADOW:       9:274; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i16, ptr [[A]], align 4275; ABORT-DYNAMIC-SHADOW-NEXT:    ret i16 [[B]]276;277; RECOVER-DYNAMIC-SHADOW-LABEL: define i16 @test_load16278; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {279; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:280; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)281; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64282; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56283; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8284; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935285; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4286; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]287; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1288; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]289; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]290; RECOVER-DYNAMIC-SHADOW:       8:291; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15292; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]293; RECOVER-DYNAMIC-SHADOW:       10:294; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 97", "{x10}"(i64 [[TMP0]])295; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]296; RECOVER-DYNAMIC-SHADOW:       11:297; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15298; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8299; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 1300; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]301; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]302; RECOVER-DYNAMIC-SHADOW:       16:303; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15304; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr305; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1306; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]307; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]308; RECOVER-DYNAMIC-SHADOW:       21:309; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]310; RECOVER-DYNAMIC-SHADOW:       22:311; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i16, ptr [[A]], align 4312; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i16 [[B]]313;314; ABORT-ZERO-BASED-SHADOW-LABEL: define i16 @test_load16315; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {316; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:317; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)318; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64319; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56320; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8321; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935322; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4323; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr324; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1325; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]326; ABORT-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]327; ABORT-ZERO-BASED-SHADOW:       8:328; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 1)329; ABORT-ZERO-BASED-SHADOW-NEXT:    br label [[TMP9]]330; ABORT-ZERO-BASED-SHADOW:       9:331; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i16, ptr [[A]], align 4332; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i16 [[B]]333;334; RECOVER-ZERO-BASED-SHADOW-LABEL: define i16 @test_load16335; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {336; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:337; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)338; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64339; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56340; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8341; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935342; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4343; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr344; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1345; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]346; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]347; RECOVER-ZERO-BASED-SHADOW:       8:348; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15349; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]350; RECOVER-ZERO-BASED-SHADOW:       10:351; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 97", "{x10}"(i64 [[TMP0]])352; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]353; RECOVER-ZERO-BASED-SHADOW:       11:354; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15355; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8356; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 1357; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]358; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]359; RECOVER-ZERO-BASED-SHADOW:       16:360; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15361; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr362; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1363; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]364; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]365; RECOVER-ZERO-BASED-SHADOW:       21:366; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]367; RECOVER-ZERO-BASED-SHADOW:       22:368; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i16, ptr [[A]], align 4369; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i16 [[B]]370;371entry:372  %b = load i16, ptr %a, align 4373  ret i16 %b374}375 376define i32 @test_load32(ptr %a) sanitize_hwaddress {377; CHECK-LABEL: define i32 @test_load32378; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {379; CHECK-NEXT:  entry:380; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8381; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935382; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295383; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1384; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr385; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64386; CHECK-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56387; CHECK-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8388; CHECK-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935389; CHECK-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4390; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]391; CHECK-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1392; CHECK-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]393; CHECK-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]394; CHECK:       12:395; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 2)396; CHECK-NEXT:    br label [[TMP13]]397; CHECK:       13:398; CHECK-NEXT:    [[B:%.*]] = load i32, ptr [[A]], align 4399; CHECK-NEXT:    ret i32 [[B]]400;401; NOFASTPATH-LABEL: define i32 @test_load32402; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {403; NOFASTPATH-NEXT:  entry:404; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8405; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935406; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295407; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1408; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr409; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 2)410; NOFASTPATH-NEXT:    [[B:%.*]] = load i32, ptr [[A]], align 4411; NOFASTPATH-NEXT:    ret i32 [[B]]412;413; FASTPATH-LABEL: define i32 @test_load32414; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {415; FASTPATH-NEXT:  entry:416; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8417; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935418; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295419; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1420; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr421; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64422; FASTPATH-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56423; FASTPATH-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8424; FASTPATH-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935425; FASTPATH-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4426; FASTPATH-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]427; FASTPATH-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1428; FASTPATH-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]429; FASTPATH-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]430; FASTPATH:       12:431; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 2)432; FASTPATH-NEXT:    br label [[TMP13]]433; FASTPATH:       13:434; FASTPATH-NEXT:    [[B:%.*]] = load i32, ptr [[A]], align 4435; FASTPATH-NEXT:    ret i32 [[B]]436;437; ABORT-DYNAMIC-SHADOW-LABEL: define i32 @test_load32438; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {439; ABORT-DYNAMIC-SHADOW-NEXT:  entry:440; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)441; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64442; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56443; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8444; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935445; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4446; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]447; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1448; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]449; ABORT-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]450; ABORT-DYNAMIC-SHADOW:       8:451; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 2)452; ABORT-DYNAMIC-SHADOW-NEXT:    br label [[TMP9]]453; ABORT-DYNAMIC-SHADOW:       9:454; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i32, ptr [[A]], align 4455; ABORT-DYNAMIC-SHADOW-NEXT:    ret i32 [[B]]456;457; RECOVER-DYNAMIC-SHADOW-LABEL: define i32 @test_load32458; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {459; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:460; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)461; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64462; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56463; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8464; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935465; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4466; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]467; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1468; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]469; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]470; RECOVER-DYNAMIC-SHADOW:       8:471; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15472; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]473; RECOVER-DYNAMIC-SHADOW:       10:474; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 98", "{x10}"(i64 [[TMP0]])475; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]476; RECOVER-DYNAMIC-SHADOW:       11:477; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15478; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8479; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 3480; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]481; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]482; RECOVER-DYNAMIC-SHADOW:       16:483; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15484; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr485; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1486; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]487; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]488; RECOVER-DYNAMIC-SHADOW:       21:489; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]490; RECOVER-DYNAMIC-SHADOW:       22:491; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i32, ptr [[A]], align 4492; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i32 [[B]]493;494; ABORT-ZERO-BASED-SHADOW-LABEL: define i32 @test_load32495; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {496; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:497; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)498; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64499; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56500; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8501; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935502; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4503; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr504; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1505; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]506; ABORT-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]507; ABORT-ZERO-BASED-SHADOW:       8:508; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 2)509; ABORT-ZERO-BASED-SHADOW-NEXT:    br label [[TMP9]]510; ABORT-ZERO-BASED-SHADOW:       9:511; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i32, ptr [[A]], align 4512; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i32 [[B]]513;514; RECOVER-ZERO-BASED-SHADOW-LABEL: define i32 @test_load32515; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {516; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:517; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)518; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64519; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56520; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8521; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935522; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4523; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr524; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1525; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]526; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]527; RECOVER-ZERO-BASED-SHADOW:       8:528; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15529; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]530; RECOVER-ZERO-BASED-SHADOW:       10:531; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 98", "{x10}"(i64 [[TMP0]])532; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]533; RECOVER-ZERO-BASED-SHADOW:       11:534; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15535; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8536; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 3537; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]538; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]539; RECOVER-ZERO-BASED-SHADOW:       16:540; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15541; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr542; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1543; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]544; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]545; RECOVER-ZERO-BASED-SHADOW:       21:546; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]547; RECOVER-ZERO-BASED-SHADOW:       22:548; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i32, ptr [[A]], align 4549; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i32 [[B]]550;551entry:552  %b = load i32, ptr %a, align 4553  ret i32 %b554}555 556define i64 @test_load64(ptr %a) sanitize_hwaddress {557; CHECK-LABEL: define i64 @test_load64558; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {559; CHECK-NEXT:  entry:560; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8561; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935562; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295563; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1564; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr565; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64566; CHECK-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56567; CHECK-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8568; CHECK-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935569; CHECK-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4570; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]571; CHECK-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1572; CHECK-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]573; CHECK-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]574; CHECK:       12:575; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 3)576; CHECK-NEXT:    br label [[TMP13]]577; CHECK:       13:578; CHECK-NEXT:    [[B:%.*]] = load i64, ptr [[A]], align 8579; CHECK-NEXT:    ret i64 [[B]]580;581; NOFASTPATH-LABEL: define i64 @test_load64582; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {583; NOFASTPATH-NEXT:  entry:584; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8585; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935586; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295587; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1588; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr589; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 3)590; NOFASTPATH-NEXT:    [[B:%.*]] = load i64, ptr [[A]], align 8591; NOFASTPATH-NEXT:    ret i64 [[B]]592;593; FASTPATH-LABEL: define i64 @test_load64594; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {595; FASTPATH-NEXT:  entry:596; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8597; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935598; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295599; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1600; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr601; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64602; FASTPATH-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56603; FASTPATH-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8604; FASTPATH-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935605; FASTPATH-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4606; FASTPATH-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]607; FASTPATH-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1608; FASTPATH-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]609; FASTPATH-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]610; FASTPATH:       12:611; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 3)612; FASTPATH-NEXT:    br label [[TMP13]]613; FASTPATH:       13:614; FASTPATH-NEXT:    [[B:%.*]] = load i64, ptr [[A]], align 8615; FASTPATH-NEXT:    ret i64 [[B]]616;617; ABORT-DYNAMIC-SHADOW-LABEL: define i64 @test_load64618; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {619; ABORT-DYNAMIC-SHADOW-NEXT:  entry:620; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)621; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64622; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56623; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8624; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935625; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4626; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]627; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1628; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]629; ABORT-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]630; ABORT-DYNAMIC-SHADOW:       8:631; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 3)632; ABORT-DYNAMIC-SHADOW-NEXT:    br label [[TMP9]]633; ABORT-DYNAMIC-SHADOW:       9:634; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i64, ptr [[A]], align 8635; ABORT-DYNAMIC-SHADOW-NEXT:    ret i64 [[B]]636;637; RECOVER-DYNAMIC-SHADOW-LABEL: define i64 @test_load64638; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {639; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:640; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)641; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64642; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56643; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8644; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935645; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4646; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]647; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1648; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]649; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]650; RECOVER-DYNAMIC-SHADOW:       8:651; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15652; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]653; RECOVER-DYNAMIC-SHADOW:       10:654; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 99", "{x10}"(i64 [[TMP0]])655; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]656; RECOVER-DYNAMIC-SHADOW:       11:657; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15658; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8659; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 7660; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]661; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]662; RECOVER-DYNAMIC-SHADOW:       16:663; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15664; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr665; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1666; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]667; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]668; RECOVER-DYNAMIC-SHADOW:       21:669; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]670; RECOVER-DYNAMIC-SHADOW:       22:671; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i64, ptr [[A]], align 8672; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i64 [[B]]673;674; ABORT-ZERO-BASED-SHADOW-LABEL: define i64 @test_load64675; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {676; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:677; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)678; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64679; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56680; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8681; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935682; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4683; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr684; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1685; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]686; ABORT-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]687; ABORT-ZERO-BASED-SHADOW:       8:688; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 3)689; ABORT-ZERO-BASED-SHADOW-NEXT:    br label [[TMP9]]690; ABORT-ZERO-BASED-SHADOW:       9:691; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i64, ptr [[A]], align 8692; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i64 [[B]]693;694; RECOVER-ZERO-BASED-SHADOW-LABEL: define i64 @test_load64695; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {696; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:697; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)698; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64699; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56700; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8701; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935702; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4703; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr704; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1705; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]706; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]707; RECOVER-ZERO-BASED-SHADOW:       8:708; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15709; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]710; RECOVER-ZERO-BASED-SHADOW:       10:711; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 99", "{x10}"(i64 [[TMP0]])712; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]713; RECOVER-ZERO-BASED-SHADOW:       11:714; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15715; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8716; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 7717; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]718; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]719; RECOVER-ZERO-BASED-SHADOW:       16:720; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15721; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr722; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1723; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]724; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]725; RECOVER-ZERO-BASED-SHADOW:       21:726; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]727; RECOVER-ZERO-BASED-SHADOW:       22:728; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i64, ptr [[A]], align 8729; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i64 [[B]]730;731entry:732  %b = load i64, ptr %a, align 8733  ret i64 %b734}735 736define i128 @test_load128(ptr %a) sanitize_hwaddress {737; CHECK-LABEL: define i128 @test_load128738; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {739; CHECK-NEXT:  entry:740; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8741; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935742; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295743; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1744; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr745; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64746; CHECK-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56747; CHECK-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8748; CHECK-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935749; CHECK-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4750; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]751; CHECK-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1752; CHECK-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]753; CHECK-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]754; CHECK:       12:755; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 4)756; CHECK-NEXT:    br label [[TMP13]]757; CHECK:       13:758; CHECK-NEXT:    [[B:%.*]] = load i128, ptr [[A]], align 16759; CHECK-NEXT:    ret i128 [[B]]760;761; NOFASTPATH-LABEL: define i128 @test_load128762; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {763; NOFASTPATH-NEXT:  entry:764; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8765; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935766; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295767; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1768; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr769; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 4)770; NOFASTPATH-NEXT:    [[B:%.*]] = load i128, ptr [[A]], align 16771; NOFASTPATH-NEXT:    ret i128 [[B]]772;773; FASTPATH-LABEL: define i128 @test_load128774; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {775; FASTPATH-NEXT:  entry:776; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8777; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935778; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295779; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1780; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr781; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64782; FASTPATH-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 56783; FASTPATH-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8784; FASTPATH-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 72057594037927935785; FASTPATH-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 4786; FASTPATH-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]787; FASTPATH-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 1788; FASTPATH-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]789; FASTPATH-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]790; FASTPATH:       12:791; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 4)792; FASTPATH-NEXT:    br label [[TMP13]]793; FASTPATH:       13:794; FASTPATH-NEXT:    [[B:%.*]] = load i128, ptr [[A]], align 16795; FASTPATH-NEXT:    ret i128 [[B]]796;797; ABORT-DYNAMIC-SHADOW-LABEL: define i128 @test_load128798; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {799; ABORT-DYNAMIC-SHADOW-NEXT:  entry:800; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)801; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64802; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56803; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8804; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935805; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4806; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]807; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1808; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]809; ABORT-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]810; ABORT-DYNAMIC-SHADOW:       8:811; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 4)812; ABORT-DYNAMIC-SHADOW-NEXT:    br label [[TMP9]]813; ABORT-DYNAMIC-SHADOW:       9:814; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i128, ptr [[A]], align 16815; ABORT-DYNAMIC-SHADOW-NEXT:    ret i128 [[B]]816;817; RECOVER-DYNAMIC-SHADOW-LABEL: define i128 @test_load128818; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {819; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:820; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)821; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64822; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56823; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8824; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935825; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4826; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]827; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1828; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]829; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]830; RECOVER-DYNAMIC-SHADOW:       8:831; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15832; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]833; RECOVER-DYNAMIC-SHADOW:       10:834; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 100", "{x10}"(i64 [[TMP0]])835; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]836; RECOVER-DYNAMIC-SHADOW:       11:837; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15838; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8839; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 15840; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]841; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]842; RECOVER-DYNAMIC-SHADOW:       16:843; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15844; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr845; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1846; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]847; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]848; RECOVER-DYNAMIC-SHADOW:       21:849; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]850; RECOVER-DYNAMIC-SHADOW:       22:851; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i128, ptr [[A]], align 16852; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i128 [[B]]853;854; ABORT-ZERO-BASED-SHADOW-LABEL: define i128 @test_load128855; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {856; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:857; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)858; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64859; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56860; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8861; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935862; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4863; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr864; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1865; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]866; ABORT-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]867; ABORT-ZERO-BASED-SHADOW:       8:868; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 4)869; ABORT-ZERO-BASED-SHADOW-NEXT:    br label [[TMP9]]870; ABORT-ZERO-BASED-SHADOW:       9:871; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i128, ptr [[A]], align 16872; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i128 [[B]]873;874; RECOVER-ZERO-BASED-SHADOW-LABEL: define i128 @test_load128875; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {876; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:877; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)878; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64879; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56880; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8881; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935882; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4883; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr884; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1885; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]886; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]887; RECOVER-ZERO-BASED-SHADOW:       8:888; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15889; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]890; RECOVER-ZERO-BASED-SHADOW:       10:891; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 100", "{x10}"(i64 [[TMP0]])892; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]893; RECOVER-ZERO-BASED-SHADOW:       11:894; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15895; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8896; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 15897; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]898; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]899; RECOVER-ZERO-BASED-SHADOW:       16:900; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15901; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr902; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1903; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]904; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]905; RECOVER-ZERO-BASED-SHADOW:       21:906; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]907; RECOVER-ZERO-BASED-SHADOW:       22:908; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i128, ptr [[A]], align 16909; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i128 [[B]]910;911entry:912  %b = load i128, ptr %a, align 16913  ret i128 %b914}915 916define i40 @test_load40(ptr %a) sanitize_hwaddress {917; CHECK-LABEL: define i40 @test_load40918; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {919; CHECK-NEXT:  entry:920; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8921; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935922; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295923; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1924; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr925; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64926; CHECK-NEXT:    call void @__hwasan_loadN(i64 [[TMP4]], i64 5)927; CHECK-NEXT:    [[B:%.*]] = load i40, ptr [[A]], align 4928; CHECK-NEXT:    ret i40 [[B]]929;930; NOFASTPATH-LABEL: define i40 @test_load40931; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {932; NOFASTPATH-NEXT:  entry:933; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8934; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935935; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295936; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1937; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr938; NOFASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64939; NOFASTPATH-NEXT:    call void @__hwasan_loadN(i64 [[TMP4]], i64 5)940; NOFASTPATH-NEXT:    [[B:%.*]] = load i40, ptr [[A]], align 4941; NOFASTPATH-NEXT:    ret i40 [[B]]942;943; FASTPATH-LABEL: define i40 @test_load40944; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {945; FASTPATH-NEXT:  entry:946; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 8947; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 72057594037927935948; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 4294967295949; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 1950; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr951; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i64952; FASTPATH-NEXT:    call void @__hwasan_loadN(i64 [[TMP4]], i64 5)953; FASTPATH-NEXT:    [[B:%.*]] = load i40, ptr [[A]], align 4954; FASTPATH-NEXT:    ret i40 [[B]]955;956; ABORT-DYNAMIC-SHADOW-LABEL: define i40 @test_load40957; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {958; ABORT-DYNAMIC-SHADOW-NEXT:  entry:959; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)960; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64961; ABORT-DYNAMIC-SHADOW-NEXT:    call void @__hwasan_loadN(i64 [[TMP0]], i64 5)962; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i40, ptr [[A]], align 4963; ABORT-DYNAMIC-SHADOW-NEXT:    ret i40 [[B]]964;965; RECOVER-DYNAMIC-SHADOW-LABEL: define i40 @test_load40966; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {967; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:968; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)969; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64970; RECOVER-DYNAMIC-SHADOW-NEXT:    call void @__hwasan_loadN_noabort(i64 [[TMP0]], i64 5)971; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i40, ptr [[A]], align 4972; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i40 [[B]]973;974; ABORT-ZERO-BASED-SHADOW-LABEL: define i40 @test_load40975; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {976; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:977; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)978; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64979; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @__hwasan_loadN(i64 [[TMP0]], i64 5)980; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i40, ptr [[A]], align 4981; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i40 [[B]]982;983; RECOVER-ZERO-BASED-SHADOW-LABEL: define i40 @test_load40984; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {985; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:986; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)987; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64988; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void @__hwasan_loadN_noabort(i64 [[TMP0]], i64 5)989; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i40, ptr [[A]], align 4990; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i40 [[B]]991;992entry:993  %b = load i40, ptr %a, align 4994  ret i40 %b995}996 997define void @test_store8(ptr %a, i8 %b) sanitize_hwaddress {998; CHECK-LABEL: define void @test_store8999; CHECK-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {1000; CHECK-NEXT:  entry:1001; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 81002; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 720575940379279351003; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 42949672951004; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 11005; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr1006; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i641007; CHECK-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 561008; CHECK-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i81009; CHECK-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 720575940379279351010; CHECK-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 41011; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]1012; CHECK-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 11013; CHECK-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]1014; CHECK-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]1015; CHECK:       12:1016; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 16)1017; CHECK-NEXT:    br label [[TMP13]]1018; CHECK:       13:1019; CHECK-NEXT:    store i8 [[B]], ptr [[A]], align 41020; CHECK-NEXT:    ret void1021;1022; NOFASTPATH-LABEL: define void @test_store81023; NOFASTPATH-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {1024; NOFASTPATH-NEXT:  entry:1025; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 81026; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 720575940379279351027; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 42949672951028; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 11029; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr1030; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 16)1031; NOFASTPATH-NEXT:    store i8 [[B]], ptr [[A]], align 41032; NOFASTPATH-NEXT:    ret void1033;1034; FASTPATH-LABEL: define void @test_store81035; FASTPATH-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {1036; FASTPATH-NEXT:  entry:1037; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 81038; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 720575940379279351039; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 42949672951040; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 11041; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr1042; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i641043; FASTPATH-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 561044; FASTPATH-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i81045; FASTPATH-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 720575940379279351046; FASTPATH-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 41047; FASTPATH-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]1048; FASTPATH-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 11049; FASTPATH-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]1050; FASTPATH-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]1051; FASTPATH:       12:1052; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 16)1053; FASTPATH-NEXT:    br label [[TMP13]]1054; FASTPATH:       13:1055; FASTPATH-NEXT:    store i8 [[B]], ptr [[A]], align 41056; FASTPATH-NEXT:    ret void1057;1058; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store81059; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {1060; ABORT-DYNAMIC-SHADOW-NEXT:  entry:1061; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1062; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641063; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561064; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81065; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351066; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41067; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]1068; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11069; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1070; ABORT-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]1071; ABORT-DYNAMIC-SHADOW:       8:1072; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 16)1073; ABORT-DYNAMIC-SHADOW-NEXT:    br label [[TMP9]]1074; ABORT-DYNAMIC-SHADOW:       9:1075; ABORT-DYNAMIC-SHADOW-NEXT:    store i8 [[B]], ptr [[A]], align 41076; ABORT-DYNAMIC-SHADOW-NEXT:    ret void1077;1078; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store81079; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {1080; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:1081; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1082; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641083; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561084; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81085; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351086; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41087; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]1088; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11089; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1090; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]1091; RECOVER-DYNAMIC-SHADOW:       8:1092; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 151093; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]1094; RECOVER-DYNAMIC-SHADOW:       10:1095; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 112", "{x10}"(i64 [[TMP0]])1096; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]1097; RECOVER-DYNAMIC-SHADOW:       11:1098; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 151099; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i81100; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 01101; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]1102; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]1103; RECOVER-DYNAMIC-SHADOW:       16:1104; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 151105; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr1106; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 11107; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]1108; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]1109; RECOVER-DYNAMIC-SHADOW:       21:1110; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]1111; RECOVER-DYNAMIC-SHADOW:       22:1112; RECOVER-DYNAMIC-SHADOW-NEXT:    store i8 [[B]], ptr [[A]], align 41113; RECOVER-DYNAMIC-SHADOW-NEXT:    ret void1114;1115; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store81116; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {1117; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:1118; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)1119; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641120; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561121; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81122; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351123; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41124; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr1125; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11126; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1127; ABORT-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]1128; ABORT-ZERO-BASED-SHADOW:       8:1129; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 16)1130; ABORT-ZERO-BASED-SHADOW-NEXT:    br label [[TMP9]]1131; ABORT-ZERO-BASED-SHADOW:       9:1132; ABORT-ZERO-BASED-SHADOW-NEXT:    store i8 [[B]], ptr [[A]], align 41133; ABORT-ZERO-BASED-SHADOW-NEXT:    ret void1134;1135; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store81136; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {1137; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:1138; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)1139; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641140; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561141; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81142; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351143; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41144; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr1145; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11146; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1147; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]1148; RECOVER-ZERO-BASED-SHADOW:       8:1149; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 151150; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]1151; RECOVER-ZERO-BASED-SHADOW:       10:1152; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 112", "{x10}"(i64 [[TMP0]])1153; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]1154; RECOVER-ZERO-BASED-SHADOW:       11:1155; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 151156; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i81157; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 01158; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]1159; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]1160; RECOVER-ZERO-BASED-SHADOW:       16:1161; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 151162; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr1163; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 11164; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]1165; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]1166; RECOVER-ZERO-BASED-SHADOW:       21:1167; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]1168; RECOVER-ZERO-BASED-SHADOW:       22:1169; RECOVER-ZERO-BASED-SHADOW-NEXT:    store i8 [[B]], ptr [[A]], align 41170; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret void1171;1172entry:1173  store i8 %b, ptr %a, align 41174  ret void1175}1176 1177define void @test_store16(ptr %a, i16 %b) sanitize_hwaddress {1178; CHECK-LABEL: define void @test_store161179; CHECK-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1180; CHECK-NEXT:  entry:1181; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 81182; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 720575940379279351183; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 42949672951184; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 11185; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr1186; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i641187; CHECK-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 561188; CHECK-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i81189; CHECK-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 720575940379279351190; CHECK-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 41191; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]1192; CHECK-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 11193; CHECK-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]1194; CHECK-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]1195; CHECK:       12:1196; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 17)1197; CHECK-NEXT:    br label [[TMP13]]1198; CHECK:       13:1199; CHECK-NEXT:    store i16 [[B]], ptr [[A]], align 41200; CHECK-NEXT:    ret void1201;1202; NOFASTPATH-LABEL: define void @test_store161203; NOFASTPATH-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1204; NOFASTPATH-NEXT:  entry:1205; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 81206; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 720575940379279351207; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 42949672951208; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 11209; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr1210; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 17)1211; NOFASTPATH-NEXT:    store i16 [[B]], ptr [[A]], align 41212; NOFASTPATH-NEXT:    ret void1213;1214; FASTPATH-LABEL: define void @test_store161215; FASTPATH-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1216; FASTPATH-NEXT:  entry:1217; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 81218; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 720575940379279351219; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 42949672951220; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 11221; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr1222; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i641223; FASTPATH-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 561224; FASTPATH-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i81225; FASTPATH-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 720575940379279351226; FASTPATH-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 41227; FASTPATH-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]1228; FASTPATH-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 11229; FASTPATH-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]1230; FASTPATH-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]1231; FASTPATH:       12:1232; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 17)1233; FASTPATH-NEXT:    br label [[TMP13]]1234; FASTPATH:       13:1235; FASTPATH-NEXT:    store i16 [[B]], ptr [[A]], align 41236; FASTPATH-NEXT:    ret void1237;1238; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store161239; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1240; ABORT-DYNAMIC-SHADOW-NEXT:  entry:1241; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1242; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641243; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561244; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81245; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351246; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41247; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]1248; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11249; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1250; ABORT-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]1251; ABORT-DYNAMIC-SHADOW:       8:1252; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 17)1253; ABORT-DYNAMIC-SHADOW-NEXT:    br label [[TMP9]]1254; ABORT-DYNAMIC-SHADOW:       9:1255; ABORT-DYNAMIC-SHADOW-NEXT:    store i16 [[B]], ptr [[A]], align 41256; ABORT-DYNAMIC-SHADOW-NEXT:    ret void1257;1258; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store161259; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1260; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:1261; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1262; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641263; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561264; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81265; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351266; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41267; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]1268; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11269; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1270; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]1271; RECOVER-DYNAMIC-SHADOW:       8:1272; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 151273; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]1274; RECOVER-DYNAMIC-SHADOW:       10:1275; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 113", "{x10}"(i64 [[TMP0]])1276; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]1277; RECOVER-DYNAMIC-SHADOW:       11:1278; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 151279; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i81280; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 11281; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]1282; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]1283; RECOVER-DYNAMIC-SHADOW:       16:1284; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 151285; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr1286; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 11287; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]1288; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]1289; RECOVER-DYNAMIC-SHADOW:       21:1290; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]1291; RECOVER-DYNAMIC-SHADOW:       22:1292; RECOVER-DYNAMIC-SHADOW-NEXT:    store i16 [[B]], ptr [[A]], align 41293; RECOVER-DYNAMIC-SHADOW-NEXT:    ret void1294;1295; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store161296; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1297; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:1298; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)1299; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641300; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561301; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81302; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351303; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41304; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr1305; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11306; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1307; ABORT-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]1308; ABORT-ZERO-BASED-SHADOW:       8:1309; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 17)1310; ABORT-ZERO-BASED-SHADOW-NEXT:    br label [[TMP9]]1311; ABORT-ZERO-BASED-SHADOW:       9:1312; ABORT-ZERO-BASED-SHADOW-NEXT:    store i16 [[B]], ptr [[A]], align 41313; ABORT-ZERO-BASED-SHADOW-NEXT:    ret void1314;1315; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store161316; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1317; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:1318; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)1319; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641320; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561321; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81322; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351323; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41324; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr1325; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11326; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1327; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]1328; RECOVER-ZERO-BASED-SHADOW:       8:1329; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 151330; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]1331; RECOVER-ZERO-BASED-SHADOW:       10:1332; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 113", "{x10}"(i64 [[TMP0]])1333; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]1334; RECOVER-ZERO-BASED-SHADOW:       11:1335; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 151336; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i81337; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 11338; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]1339; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]1340; RECOVER-ZERO-BASED-SHADOW:       16:1341; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 151342; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr1343; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 11344; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]1345; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]1346; RECOVER-ZERO-BASED-SHADOW:       21:1347; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]1348; RECOVER-ZERO-BASED-SHADOW:       22:1349; RECOVER-ZERO-BASED-SHADOW-NEXT:    store i16 [[B]], ptr [[A]], align 41350; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret void1351;1352entry:1353  store i16 %b, ptr %a, align 41354  ret void1355}1356 1357define void @test_store32(ptr %a, i32 %b) sanitize_hwaddress {1358; CHECK-LABEL: define void @test_store321359; CHECK-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1360; CHECK-NEXT:  entry:1361; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 81362; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 720575940379279351363; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 42949672951364; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 11365; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr1366; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i641367; CHECK-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 561368; CHECK-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i81369; CHECK-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 720575940379279351370; CHECK-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 41371; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]1372; CHECK-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 11373; CHECK-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]1374; CHECK-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]1375; CHECK:       12:1376; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 18)1377; CHECK-NEXT:    br label [[TMP13]]1378; CHECK:       13:1379; CHECK-NEXT:    store i32 [[B]], ptr [[A]], align 41380; CHECK-NEXT:    ret void1381;1382; NOFASTPATH-LABEL: define void @test_store321383; NOFASTPATH-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1384; NOFASTPATH-NEXT:  entry:1385; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 81386; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 720575940379279351387; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 42949672951388; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 11389; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr1390; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 18)1391; NOFASTPATH-NEXT:    store i32 [[B]], ptr [[A]], align 41392; NOFASTPATH-NEXT:    ret void1393;1394; FASTPATH-LABEL: define void @test_store321395; FASTPATH-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1396; FASTPATH-NEXT:  entry:1397; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 81398; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 720575940379279351399; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 42949672951400; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 11401; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr1402; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i641403; FASTPATH-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 561404; FASTPATH-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i81405; FASTPATH-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 720575940379279351406; FASTPATH-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 41407; FASTPATH-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]1408; FASTPATH-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 11409; FASTPATH-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]1410; FASTPATH-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]1411; FASTPATH:       12:1412; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 18)1413; FASTPATH-NEXT:    br label [[TMP13]]1414; FASTPATH:       13:1415; FASTPATH-NEXT:    store i32 [[B]], ptr [[A]], align 41416; FASTPATH-NEXT:    ret void1417;1418; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store321419; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1420; ABORT-DYNAMIC-SHADOW-NEXT:  entry:1421; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1422; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641423; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561424; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81425; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351426; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41427; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]1428; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11429; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1430; ABORT-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]1431; ABORT-DYNAMIC-SHADOW:       8:1432; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 18)1433; ABORT-DYNAMIC-SHADOW-NEXT:    br label [[TMP9]]1434; ABORT-DYNAMIC-SHADOW:       9:1435; ABORT-DYNAMIC-SHADOW-NEXT:    store i32 [[B]], ptr [[A]], align 41436; ABORT-DYNAMIC-SHADOW-NEXT:    ret void1437;1438; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store321439; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1440; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:1441; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1442; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641443; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561444; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81445; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351446; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41447; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]1448; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11449; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1450; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]1451; RECOVER-DYNAMIC-SHADOW:       8:1452; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 151453; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]1454; RECOVER-DYNAMIC-SHADOW:       10:1455; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 114", "{x10}"(i64 [[TMP0]])1456; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]1457; RECOVER-DYNAMIC-SHADOW:       11:1458; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 151459; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i81460; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 31461; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]1462; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]1463; RECOVER-DYNAMIC-SHADOW:       16:1464; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 151465; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr1466; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 11467; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]1468; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]1469; RECOVER-DYNAMIC-SHADOW:       21:1470; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]1471; RECOVER-DYNAMIC-SHADOW:       22:1472; RECOVER-DYNAMIC-SHADOW-NEXT:    store i32 [[B]], ptr [[A]], align 41473; RECOVER-DYNAMIC-SHADOW-NEXT:    ret void1474;1475; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store321476; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1477; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:1478; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)1479; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641480; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561481; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81482; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351483; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41484; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr1485; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11486; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1487; ABORT-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]1488; ABORT-ZERO-BASED-SHADOW:       8:1489; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 18)1490; ABORT-ZERO-BASED-SHADOW-NEXT:    br label [[TMP9]]1491; ABORT-ZERO-BASED-SHADOW:       9:1492; ABORT-ZERO-BASED-SHADOW-NEXT:    store i32 [[B]], ptr [[A]], align 41493; ABORT-ZERO-BASED-SHADOW-NEXT:    ret void1494;1495; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store321496; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1497; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:1498; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)1499; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641500; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561501; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81502; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351503; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41504; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr1505; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11506; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1507; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]1508; RECOVER-ZERO-BASED-SHADOW:       8:1509; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 151510; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]1511; RECOVER-ZERO-BASED-SHADOW:       10:1512; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 114", "{x10}"(i64 [[TMP0]])1513; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]1514; RECOVER-ZERO-BASED-SHADOW:       11:1515; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 151516; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i81517; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 31518; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]1519; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]1520; RECOVER-ZERO-BASED-SHADOW:       16:1521; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 151522; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr1523; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 11524; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]1525; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]1526; RECOVER-ZERO-BASED-SHADOW:       21:1527; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]1528; RECOVER-ZERO-BASED-SHADOW:       22:1529; RECOVER-ZERO-BASED-SHADOW-NEXT:    store i32 [[B]], ptr [[A]], align 41530; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret void1531;1532entry:1533  store i32 %b, ptr %a, align 41534  ret void1535}1536 1537define void @test_store64(ptr %a, i64 %b) sanitize_hwaddress {1538; CHECK-LABEL: define void @test_store641539; CHECK-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {1540; CHECK-NEXT:  entry:1541; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 81542; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 720575940379279351543; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 42949672951544; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 11545; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr1546; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i641547; CHECK-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 561548; CHECK-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i81549; CHECK-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 720575940379279351550; CHECK-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 41551; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]1552; CHECK-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 11553; CHECK-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]1554; CHECK-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]1555; CHECK:       12:1556; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 19)1557; CHECK-NEXT:    br label [[TMP13]]1558; CHECK:       13:1559; CHECK-NEXT:    store i64 [[B]], ptr [[A]], align 81560; CHECK-NEXT:    ret void1561;1562; NOFASTPATH-LABEL: define void @test_store641563; NOFASTPATH-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {1564; NOFASTPATH-NEXT:  entry:1565; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 81566; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 720575940379279351567; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 42949672951568; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 11569; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr1570; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 19)1571; NOFASTPATH-NEXT:    store i64 [[B]], ptr [[A]], align 81572; NOFASTPATH-NEXT:    ret void1573;1574; FASTPATH-LABEL: define void @test_store641575; FASTPATH-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {1576; FASTPATH-NEXT:  entry:1577; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 81578; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 720575940379279351579; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 42949672951580; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 11581; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr1582; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i641583; FASTPATH-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 561584; FASTPATH-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i81585; FASTPATH-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 720575940379279351586; FASTPATH-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 41587; FASTPATH-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]1588; FASTPATH-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 11589; FASTPATH-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]1590; FASTPATH-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]1591; FASTPATH:       12:1592; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 19)1593; FASTPATH-NEXT:    br label [[TMP13]]1594; FASTPATH:       13:1595; FASTPATH-NEXT:    store i64 [[B]], ptr [[A]], align 81596; FASTPATH-NEXT:    ret void1597;1598; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store641599; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {1600; ABORT-DYNAMIC-SHADOW-NEXT:  entry:1601; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1602; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641603; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561604; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81605; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351606; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41607; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]1608; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11609; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1610; ABORT-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]1611; ABORT-DYNAMIC-SHADOW:       8:1612; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 19)1613; ABORT-DYNAMIC-SHADOW-NEXT:    br label [[TMP9]]1614; ABORT-DYNAMIC-SHADOW:       9:1615; ABORT-DYNAMIC-SHADOW-NEXT:    store i64 [[B]], ptr [[A]], align 81616; ABORT-DYNAMIC-SHADOW-NEXT:    ret void1617;1618; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store641619; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {1620; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:1621; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1622; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641623; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561624; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81625; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351626; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41627; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]1628; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11629; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1630; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]1631; RECOVER-DYNAMIC-SHADOW:       8:1632; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 151633; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]1634; RECOVER-DYNAMIC-SHADOW:       10:1635; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 115", "{x10}"(i64 [[TMP0]])1636; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]1637; RECOVER-DYNAMIC-SHADOW:       11:1638; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 151639; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i81640; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 71641; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]1642; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]1643; RECOVER-DYNAMIC-SHADOW:       16:1644; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 151645; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr1646; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 11647; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]1648; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]1649; RECOVER-DYNAMIC-SHADOW:       21:1650; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]1651; RECOVER-DYNAMIC-SHADOW:       22:1652; RECOVER-DYNAMIC-SHADOW-NEXT:    store i64 [[B]], ptr [[A]], align 81653; RECOVER-DYNAMIC-SHADOW-NEXT:    ret void1654;1655; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store641656; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {1657; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:1658; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)1659; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641660; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561661; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81662; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351663; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41664; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr1665; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11666; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1667; ABORT-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]1668; ABORT-ZERO-BASED-SHADOW:       8:1669; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 19)1670; ABORT-ZERO-BASED-SHADOW-NEXT:    br label [[TMP9]]1671; ABORT-ZERO-BASED-SHADOW:       9:1672; ABORT-ZERO-BASED-SHADOW-NEXT:    store i64 [[B]], ptr [[A]], align 81673; ABORT-ZERO-BASED-SHADOW-NEXT:    ret void1674;1675; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store641676; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {1677; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:1678; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)1679; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641680; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561681; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81682; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351683; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41684; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr1685; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11686; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1687; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]1688; RECOVER-ZERO-BASED-SHADOW:       8:1689; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 151690; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]1691; RECOVER-ZERO-BASED-SHADOW:       10:1692; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 115", "{x10}"(i64 [[TMP0]])1693; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]1694; RECOVER-ZERO-BASED-SHADOW:       11:1695; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 151696; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i81697; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 71698; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]1699; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]1700; RECOVER-ZERO-BASED-SHADOW:       16:1701; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 151702; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr1703; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 11704; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]1705; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]1706; RECOVER-ZERO-BASED-SHADOW:       21:1707; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]1708; RECOVER-ZERO-BASED-SHADOW:       22:1709; RECOVER-ZERO-BASED-SHADOW-NEXT:    store i64 [[B]], ptr [[A]], align 81710; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret void1711;1712entry:1713  store i64 %b, ptr %a, align 81714  ret void1715}1716 1717define void @test_store128(ptr %a, i128 %b) sanitize_hwaddress {1718; CHECK-LABEL: define void @test_store1281719; CHECK-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {1720; CHECK-NEXT:  entry:1721; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 81722; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 720575940379279351723; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 42949672951724; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 11725; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr1726; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i641727; CHECK-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 561728; CHECK-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i81729; CHECK-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 720575940379279351730; CHECK-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 41731; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]1732; CHECK-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 11733; CHECK-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]1734; CHECK-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]1735; CHECK:       12:1736; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 20)1737; CHECK-NEXT:    br label [[TMP13]]1738; CHECK:       13:1739; CHECK-NEXT:    store i128 [[B]], ptr [[A]], align 161740; CHECK-NEXT:    ret void1741;1742; NOFASTPATH-LABEL: define void @test_store1281743; NOFASTPATH-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {1744; NOFASTPATH-NEXT:  entry:1745; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 81746; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 720575940379279351747; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 42949672951748; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 11749; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr1750; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 20)1751; NOFASTPATH-NEXT:    store i128 [[B]], ptr [[A]], align 161752; NOFASTPATH-NEXT:    ret void1753;1754; FASTPATH-LABEL: define void @test_store1281755; FASTPATH-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {1756; FASTPATH-NEXT:  entry:1757; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 81758; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 720575940379279351759; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 42949672951760; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 11761; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr1762; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i641763; FASTPATH-NEXT:    [[TMP5:%.*]] = lshr i64 [[TMP4]], 561764; FASTPATH-NEXT:    [[TMP6:%.*]] = trunc i64 [[TMP5]] to i81765; FASTPATH-NEXT:    [[TMP7:%.*]] = and i64 [[TMP4]], 720575940379279351766; FASTPATH-NEXT:    [[TMP8:%.*]] = lshr i64 [[TMP7]], 41767; FASTPATH-NEXT:    [[TMP9:%.*]] = getelementptr i8, ptr [[TMP3]], i64 [[TMP8]]1768; FASTPATH-NEXT:    [[TMP10:%.*]] = load i8, ptr [[TMP9]], align 11769; FASTPATH-NEXT:    [[TMP11:%.*]] = icmp ne i8 [[TMP6]], [[TMP10]]1770; FASTPATH-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP13:%.*]], !prof [[PROF2]]1771; FASTPATH:       12:1772; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP3]], ptr [[A]], i32 20)1773; FASTPATH-NEXT:    br label [[TMP13]]1774; FASTPATH:       13:1775; FASTPATH-NEXT:    store i128 [[B]], ptr [[A]], align 161776; FASTPATH-NEXT:    ret void1777;1778; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store1281779; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {1780; ABORT-DYNAMIC-SHADOW-NEXT:  entry:1781; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1782; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641783; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561784; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81785; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351786; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41787; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]1788; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11789; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1790; ABORT-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]1791; ABORT-DYNAMIC-SHADOW:       8:1792; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 20)1793; ABORT-DYNAMIC-SHADOW-NEXT:    br label [[TMP9]]1794; ABORT-DYNAMIC-SHADOW:       9:1795; ABORT-DYNAMIC-SHADOW-NEXT:    store i128 [[B]], ptr [[A]], align 161796; ABORT-DYNAMIC-SHADOW-NEXT:    ret void1797;1798; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store1281799; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {1800; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:1801; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1802; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641803; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561804; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81805; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351806; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41807; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]1808; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11809; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1810; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]1811; RECOVER-DYNAMIC-SHADOW:       8:1812; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 151813; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]1814; RECOVER-DYNAMIC-SHADOW:       10:1815; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 116", "{x10}"(i64 [[TMP0]])1816; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]1817; RECOVER-DYNAMIC-SHADOW:       11:1818; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 151819; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i81820; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 151821; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]1822; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]1823; RECOVER-DYNAMIC-SHADOW:       16:1824; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 151825; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr1826; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 11827; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]1828; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]1829; RECOVER-DYNAMIC-SHADOW:       21:1830; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]1831; RECOVER-DYNAMIC-SHADOW:       22:1832; RECOVER-DYNAMIC-SHADOW-NEXT:    store i128 [[B]], ptr [[A]], align 161833; RECOVER-DYNAMIC-SHADOW-NEXT:    ret void1834;1835; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store1281836; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {1837; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:1838; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)1839; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641840; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561841; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81842; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351843; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41844; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr1845; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11846; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1847; ABORT-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]1848; ABORT-ZERO-BASED-SHADOW:       8:1849; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 20)1850; ABORT-ZERO-BASED-SHADOW-NEXT:    br label [[TMP9]]1851; ABORT-ZERO-BASED-SHADOW:       9:1852; ABORT-ZERO-BASED-SHADOW-NEXT:    store i128 [[B]], ptr [[A]], align 161853; ABORT-ZERO-BASED-SHADOW-NEXT:    ret void1854;1855; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store1281856; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {1857; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:1858; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)1859; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641860; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561861; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81862; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351863; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41864; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr1865; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11866; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1867; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]1868; RECOVER-ZERO-BASED-SHADOW:       8:1869; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 151870; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]1871; RECOVER-ZERO-BASED-SHADOW:       10:1872; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "ebreak\0Aaddiw x0, x11, 116", "{x10}"(i64 [[TMP0]])1873; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]1874; RECOVER-ZERO-BASED-SHADOW:       11:1875; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 151876; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i81877; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 151878; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]1879; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]1880; RECOVER-ZERO-BASED-SHADOW:       16:1881; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 151882; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr1883; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 11884; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]1885; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]1886; RECOVER-ZERO-BASED-SHADOW:       21:1887; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]1888; RECOVER-ZERO-BASED-SHADOW:       22:1889; RECOVER-ZERO-BASED-SHADOW-NEXT:    store i128 [[B]], ptr [[A]], align 161890; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret void1891;1892entry:1893  store i128 %b, ptr %a, align 161894  ret void1895}1896 1897define void @test_store40(ptr %a, i40 %b) sanitize_hwaddress {1898; CHECK-LABEL: define void @test_store401899; CHECK-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {1900; CHECK-NEXT:  entry:1901; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 81902; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 720575940379279351903; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 42949672951904; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 11905; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr1906; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i641907; CHECK-NEXT:    call void @__hwasan_storeN(i64 [[TMP4]], i64 5)1908; CHECK-NEXT:    store i40 [[B]], ptr [[A]], align 41909; CHECK-NEXT:    ret void1910;1911; NOFASTPATH-LABEL: define void @test_store401912; NOFASTPATH-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {1913; NOFASTPATH-NEXT:  entry:1914; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 81915; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 720575940379279351916; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 42949672951917; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 11918; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr1919; NOFASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i641920; NOFASTPATH-NEXT:    call void @__hwasan_storeN(i64 [[TMP4]], i64 5)1921; NOFASTPATH-NEXT:    store i40 [[B]], ptr [[A]], align 41922; NOFASTPATH-NEXT:    ret void1923;1924; FASTPATH-LABEL: define void @test_store401925; FASTPATH-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {1926; FASTPATH-NEXT:  entry:1927; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 81928; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 720575940379279351929; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 42949672951930; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 11931; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr1932; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i641933; FASTPATH-NEXT:    call void @__hwasan_storeN(i64 [[TMP4]], i64 5)1934; FASTPATH-NEXT:    store i40 [[B]], ptr [[A]], align 41935; FASTPATH-NEXT:    ret void1936;1937; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store401938; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {1939; ABORT-DYNAMIC-SHADOW-NEXT:  entry:1940; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1941; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641942; ABORT-DYNAMIC-SHADOW-NEXT:    call void @__hwasan_storeN(i64 [[TMP0]], i64 5)1943; ABORT-DYNAMIC-SHADOW-NEXT:    store i40 [[B]], ptr [[A]], align 41944; ABORT-DYNAMIC-SHADOW-NEXT:    ret void1945;1946; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store401947; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {1948; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:1949; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1950; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641951; RECOVER-DYNAMIC-SHADOW-NEXT:    call void @__hwasan_storeN_noabort(i64 [[TMP0]], i64 5)1952; RECOVER-DYNAMIC-SHADOW-NEXT:    store i40 [[B]], ptr [[A]], align 41953; RECOVER-DYNAMIC-SHADOW-NEXT:    ret void1954;1955; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store401956; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {1957; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:1958; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)1959; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641960; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @__hwasan_storeN(i64 [[TMP0]], i64 5)1961; ABORT-ZERO-BASED-SHADOW-NEXT:    store i40 [[B]], ptr [[A]], align 41962; ABORT-ZERO-BASED-SHADOW-NEXT:    ret void1963;1964; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store401965; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {1966; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:1967; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)1968; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641969; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void @__hwasan_storeN_noabort(i64 [[TMP0]], i64 5)1970; RECOVER-ZERO-BASED-SHADOW-NEXT:    store i40 [[B]], ptr [[A]], align 41971; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret void1972;1973entry:1974  store i40 %b, ptr %a, align 41975  ret void1976}1977 1978define void @test_store_unaligned(ptr %a, i64 %b) sanitize_hwaddress {1979; CHECK-LABEL: define void @test_store_unaligned1980; CHECK-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {1981; CHECK-NEXT:  entry:1982; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 81983; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 720575940379279351984; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 42949672951985; CHECK-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 11986; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr1987; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i641988; CHECK-NEXT:    call void @__hwasan_storeN(i64 [[TMP4]], i64 8)1989; CHECK-NEXT:    store i64 [[B]], ptr [[A]], align 41990; CHECK-NEXT:    ret void1991;1992; NOFASTPATH-LABEL: define void @test_store_unaligned1993; NOFASTPATH-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {1994; NOFASTPATH-NEXT:  entry:1995; NOFASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 81996; NOFASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 720575940379279351997; NOFASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 42949672951998; NOFASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 11999; NOFASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr2000; NOFASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i642001; NOFASTPATH-NEXT:    call void @__hwasan_storeN(i64 [[TMP4]], i64 8)2002; NOFASTPATH-NEXT:    store i64 [[B]], ptr [[A]], align 42003; NOFASTPATH-NEXT:    ret void2004;2005; FASTPATH-LABEL: define void @test_store_unaligned2006; FASTPATH-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {2007; FASTPATH-NEXT:  entry:2008; FASTPATH-NEXT:    [[TMP0:%.*]] = load i64, ptr @__hwasan_tls, align 82009; FASTPATH-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 720575940379279352010; FASTPATH-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 42949672952011; FASTPATH-NEXT:    [[HWASAN_SHADOW:%.*]] = add i64 [[TMP2]], 12012; FASTPATH-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[HWASAN_SHADOW]] to ptr2013; FASTPATH-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[A]] to i642014; FASTPATH-NEXT:    call void @__hwasan_storeN(i64 [[TMP4]], i64 8)2015; FASTPATH-NEXT:    store i64 [[B]], ptr [[A]], align 42016; FASTPATH-NEXT:    ret void2017;2018; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store_unaligned2019; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {2020; ABORT-DYNAMIC-SHADOW-NEXT:  entry:2021; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)2022; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i642023; ABORT-DYNAMIC-SHADOW-NEXT:    call void @__hwasan_storeN(i64 [[TMP0]], i64 8)2024; ABORT-DYNAMIC-SHADOW-NEXT:    store i64 [[B]], ptr [[A]], align 42025; ABORT-DYNAMIC-SHADOW-NEXT:    ret void2026;2027; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store_unaligned2028; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {2029; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:2030; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)2031; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i642032; RECOVER-DYNAMIC-SHADOW-NEXT:    call void @__hwasan_storeN_noabort(i64 [[TMP0]], i64 8)2033; RECOVER-DYNAMIC-SHADOW-NEXT:    store i64 [[B]], ptr [[A]], align 42034; RECOVER-DYNAMIC-SHADOW-NEXT:    ret void2035;2036; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store_unaligned2037; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {2038; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:2039; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)2040; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i642041; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @__hwasan_storeN(i64 [[TMP0]], i64 8)2042; ABORT-ZERO-BASED-SHADOW-NEXT:    store i64 [[B]], ptr [[A]], align 42043; ABORT-ZERO-BASED-SHADOW-NEXT:    ret void2044;2045; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store_unaligned2046; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {2047; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:2048; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)2049; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i642050; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void @__hwasan_storeN_noabort(i64 [[TMP0]], i64 8)2051; RECOVER-ZERO-BASED-SHADOW-NEXT:    store i64 [[B]], ptr [[A]], align 42052; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret void2053;2054entry:2055  store i64 %b, ptr %a, align 42056  ret void2057}2058 2059define i8 @test_load_noattr(ptr %a) {2060; CHECK-LABEL: define i8 @test_load_noattr2061; CHECK-SAME: (ptr [[A:%.*]]) {2062; CHECK-NEXT:  entry:2063; CHECK-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 42064; CHECK-NEXT:    ret i8 [[B]]2065;2066; NOFASTPATH-LABEL: define i8 @test_load_noattr2067; NOFASTPATH-SAME: (ptr [[A:%.*]]) {2068; NOFASTPATH-NEXT:  entry:2069; NOFASTPATH-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 42070; NOFASTPATH-NEXT:    ret i8 [[B]]2071;2072; FASTPATH-LABEL: define i8 @test_load_noattr2073; FASTPATH-SAME: (ptr [[A:%.*]]) {2074; FASTPATH-NEXT:  entry:2075; FASTPATH-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 42076; FASTPATH-NEXT:    ret i8 [[B]]2077;2078; ABORT-DYNAMIC-SHADOW-LABEL: define i8 @test_load_noattr2079; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) {2080; ABORT-DYNAMIC-SHADOW-NEXT:  entry:2081; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 42082; ABORT-DYNAMIC-SHADOW-NEXT:    ret i8 [[B]]2083;2084; RECOVER-DYNAMIC-SHADOW-LABEL: define i8 @test_load_noattr2085; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) {2086; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:2087; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 42088; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i8 [[B]]2089;2090; ABORT-ZERO-BASED-SHADOW-LABEL: define i8 @test_load_noattr2091; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) {2092; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:2093; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 42094; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i8 [[B]]2095;2096; RECOVER-ZERO-BASED-SHADOW-LABEL: define i8 @test_load_noattr2097; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) {2098; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:2099; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 42100; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i8 [[B]]2101;2102entry:2103  %b = load i8, ptr %a, align 42104  ret i8 %b2105}2106 2107define i8 @test_load_notmyattr(ptr %a) sanitize_address {2108; CHECK-LABEL: define i8 @test_load_notmyattr2109; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {2110; CHECK-NEXT:  entry:2111; CHECK-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 42112; CHECK-NEXT:    ret i8 [[B]]2113;2114; NOFASTPATH-LABEL: define i8 @test_load_notmyattr2115; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {2116; NOFASTPATH-NEXT:  entry:2117; NOFASTPATH-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 42118; NOFASTPATH-NEXT:    ret i8 [[B]]2119;2120; FASTPATH-LABEL: define i8 @test_load_notmyattr2121; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {2122; FASTPATH-NEXT:  entry:2123; FASTPATH-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 42124; FASTPATH-NEXT:    ret i8 [[B]]2125;2126; ABORT-DYNAMIC-SHADOW-LABEL: define i8 @test_load_notmyattr2127; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {2128; ABORT-DYNAMIC-SHADOW-NEXT:  entry:2129; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 42130; ABORT-DYNAMIC-SHADOW-NEXT:    ret i8 [[B]]2131;2132; RECOVER-DYNAMIC-SHADOW-LABEL: define i8 @test_load_notmyattr2133; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {2134; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:2135; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 42136; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i8 [[B]]2137;2138; ABORT-ZERO-BASED-SHADOW-LABEL: define i8 @test_load_notmyattr2139; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {2140; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:2141; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 42142; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i8 [[B]]2143;2144; RECOVER-ZERO-BASED-SHADOW-LABEL: define i8 @test_load_notmyattr2145; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {2146; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:2147; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 42148; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i8 [[B]]2149;2150entry:2151  %b = load i8, ptr %a, align 42152  ret i8 %b2153}2154 2155define i8 @test_load_addrspace(ptr addrspace(256) %a) sanitize_hwaddress {2156; CHECK-LABEL: define i8 @test_load_addrspace2157; CHECK-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {2158; CHECK-NEXT:  entry:2159; CHECK-NEXT:    [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 42160; CHECK-NEXT:    ret i8 [[B]]2161;2162; NOFASTPATH-LABEL: define i8 @test_load_addrspace2163; NOFASTPATH-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {2164; NOFASTPATH-NEXT:  entry:2165; NOFASTPATH-NEXT:    [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 42166; NOFASTPATH-NEXT:    ret i8 [[B]]2167;2168; FASTPATH-LABEL: define i8 @test_load_addrspace2169; FASTPATH-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {2170; FASTPATH-NEXT:  entry:2171; FASTPATH-NEXT:    [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 42172; FASTPATH-NEXT:    ret i8 [[B]]2173;2174; ABORT-DYNAMIC-SHADOW-LABEL: define i8 @test_load_addrspace2175; ABORT-DYNAMIC-SHADOW-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {2176; ABORT-DYNAMIC-SHADOW-NEXT:  entry:2177; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 42178; ABORT-DYNAMIC-SHADOW-NEXT:    ret i8 [[B]]2179;2180; RECOVER-DYNAMIC-SHADOW-LABEL: define i8 @test_load_addrspace2181; RECOVER-DYNAMIC-SHADOW-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {2182; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:2183; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 42184; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i8 [[B]]2185;2186; ABORT-ZERO-BASED-SHADOW-LABEL: define i8 @test_load_addrspace2187; ABORT-ZERO-BASED-SHADOW-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {2188; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:2189; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 42190; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i8 [[B]]2191;2192; RECOVER-ZERO-BASED-SHADOW-LABEL: define i8 @test_load_addrspace2193; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {2194; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:2195; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 42196; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i8 [[B]]2197;2198entry:2199  %b = load i8, ptr addrspace(256) %a, align 42200  ret i8 %b2201}2202 2203