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