brintos

brintos / llvm-project-archived public Read only

0
0
Text · 98.4 KiB · 355e3b9 Raw
1686 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 = "aarch64--linux-android10000"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:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)21; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 0)22; CHECK-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 423; CHECK-NEXT:    ret i8 [[B]]24;25; NOFASTPATH-LABEL: define i8 @test_load826; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {27; NOFASTPATH-NEXT:  entry:28; NOFASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)29; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 0)30; NOFASTPATH-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 431; NOFASTPATH-NEXT:    ret i8 [[B]]32;33; FASTPATH-LABEL: define i8 @test_load834; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {35; FASTPATH-NEXT:  entry:36; FASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)37; FASTPATH-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i6438; FASTPATH-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 5639; FASTPATH-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i840; FASTPATH-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 7205759403792793541; FASTPATH-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 442; FASTPATH-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]43; FASTPATH-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 144; FASTPATH-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]45; FASTPATH-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2:![0-9]+]]46; FASTPATH:       8:47; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 0)48; FASTPATH-NEXT:    br label [[TMP9]]49; FASTPATH:       9:50; FASTPATH-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 451; FASTPATH-NEXT:    ret i8 [[B]]52;53; ABORT-DYNAMIC-SHADOW-LABEL: define i8 @test_load854; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {55; ABORT-DYNAMIC-SHADOW-NEXT:  entry:56; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)57; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 0)58; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 459; ABORT-DYNAMIC-SHADOW-NEXT:    ret i8 [[B]]60;61; RECOVER-DYNAMIC-SHADOW-LABEL: define i8 @test_load862; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {63; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:64; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)65; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i6466; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 5667; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i868; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 7205759403792793569; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 470; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]71; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 172; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]73; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2:![0-9]+]]74; RECOVER-DYNAMIC-SHADOW:       8:75; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 1576; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]77; RECOVER-DYNAMIC-SHADOW:       10:78; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "brk #2336", "{x0}"(i64 [[TMP0]])79; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]80; RECOVER-DYNAMIC-SHADOW:       11:81; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 1582; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i883; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 084; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]85; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]86; RECOVER-DYNAMIC-SHADOW:       16:87; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 1588; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr89; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 190; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]91; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]92; RECOVER-DYNAMIC-SHADOW:       21:93; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]94; RECOVER-DYNAMIC-SHADOW:       22:95; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 496; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i8 [[B]]97;98; ABORT-ZERO-BASED-SHADOW-LABEL: define i8 @test_load899; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {100; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:101; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)102; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules.fixedshadow(ptr [[A]], i32 0, i64 0)103; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4104; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i8 [[B]]105;106; RECOVER-ZERO-BASED-SHADOW-LABEL: define i8 @test_load8107; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {108; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:109; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)110; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64111; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56112; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8113; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935114; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4115; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr116; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1117; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]118; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2:![0-9]+]]119; RECOVER-ZERO-BASED-SHADOW:       8:120; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15121; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]122; RECOVER-ZERO-BASED-SHADOW:       10:123; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "brk #2336", "{x0}"(i64 [[TMP0]])124; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]125; RECOVER-ZERO-BASED-SHADOW:       11:126; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15127; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8128; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 0129; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]130; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]131; RECOVER-ZERO-BASED-SHADOW:       16:132; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15133; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr134; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1135; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]136; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]137; RECOVER-ZERO-BASED-SHADOW:       21:138; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]139; RECOVER-ZERO-BASED-SHADOW:       22:140; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 4141; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i8 [[B]]142;143entry:144  %b = load i8, ptr %a, align 4145  ret i8 %b146}147 148define i16 @test_load16(ptr %a) sanitize_hwaddress {149; CHECK-LABEL: define i16 @test_load16150; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {151; CHECK-NEXT:  entry:152; CHECK-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)153; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 1)154; CHECK-NEXT:    [[B:%.*]] = load i16, ptr [[A]], align 4155; CHECK-NEXT:    ret i16 [[B]]156;157; NOFASTPATH-LABEL: define i16 @test_load16158; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {159; NOFASTPATH-NEXT:  entry:160; NOFASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)161; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 1)162; NOFASTPATH-NEXT:    [[B:%.*]] = load i16, ptr [[A]], align 4163; NOFASTPATH-NEXT:    ret i16 [[B]]164;165; FASTPATH-LABEL: define i16 @test_load16166; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {167; FASTPATH-NEXT:  entry:168; FASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)169; FASTPATH-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64170; FASTPATH-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56171; FASTPATH-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8172; FASTPATH-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935173; FASTPATH-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4174; FASTPATH-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]175; FASTPATH-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1176; FASTPATH-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]177; FASTPATH-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]178; FASTPATH:       8:179; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 1)180; FASTPATH-NEXT:    br label [[TMP9]]181; FASTPATH:       9:182; FASTPATH-NEXT:    [[B:%.*]] = load i16, ptr [[A]], align 4183; FASTPATH-NEXT:    ret i16 [[B]]184;185; ABORT-DYNAMIC-SHADOW-LABEL: define i16 @test_load16186; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {187; ABORT-DYNAMIC-SHADOW-NEXT:  entry:188; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)189; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 1)190; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i16, ptr [[A]], align 4191; ABORT-DYNAMIC-SHADOW-NEXT:    ret i16 [[B]]192;193; RECOVER-DYNAMIC-SHADOW-LABEL: define i16 @test_load16194; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {195; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:196; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)197; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64198; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56199; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8200; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935201; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4202; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]203; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1204; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]205; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]206; RECOVER-DYNAMIC-SHADOW:       8:207; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15208; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]209; RECOVER-DYNAMIC-SHADOW:       10:210; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "brk #2337", "{x0}"(i64 [[TMP0]])211; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]212; RECOVER-DYNAMIC-SHADOW:       11:213; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15214; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8215; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 1216; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]217; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]218; RECOVER-DYNAMIC-SHADOW:       16:219; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15220; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr221; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1222; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]223; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]224; RECOVER-DYNAMIC-SHADOW:       21:225; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]226; RECOVER-DYNAMIC-SHADOW:       22:227; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i16, ptr [[A]], align 4228; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i16 [[B]]229;230; ABORT-ZERO-BASED-SHADOW-LABEL: define i16 @test_load16231; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {232; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:233; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)234; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules.fixedshadow(ptr [[A]], i32 1, i64 0)235; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i16, ptr [[A]], align 4236; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i16 [[B]]237;238; RECOVER-ZERO-BASED-SHADOW-LABEL: define i16 @test_load16239; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {240; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:241; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)242; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64243; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56244; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8245; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935246; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4247; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr248; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1249; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]250; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]251; RECOVER-ZERO-BASED-SHADOW:       8:252; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15253; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]254; RECOVER-ZERO-BASED-SHADOW:       10:255; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "brk #2337", "{x0}"(i64 [[TMP0]])256; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]257; RECOVER-ZERO-BASED-SHADOW:       11:258; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15259; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8260; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 1261; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]262; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]263; RECOVER-ZERO-BASED-SHADOW:       16:264; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15265; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr266; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1267; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]268; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]269; RECOVER-ZERO-BASED-SHADOW:       21:270; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]271; RECOVER-ZERO-BASED-SHADOW:       22:272; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i16, ptr [[A]], align 4273; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i16 [[B]]274;275entry:276  %b = load i16, ptr %a, align 4277  ret i16 %b278}279 280define i32 @test_load32(ptr %a) sanitize_hwaddress {281; CHECK-LABEL: define i32 @test_load32282; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {283; CHECK-NEXT:  entry:284; CHECK-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)285; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 2)286; CHECK-NEXT:    [[B:%.*]] = load i32, ptr [[A]], align 4287; CHECK-NEXT:    ret i32 [[B]]288;289; NOFASTPATH-LABEL: define i32 @test_load32290; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {291; NOFASTPATH-NEXT:  entry:292; NOFASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)293; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 2)294; NOFASTPATH-NEXT:    [[B:%.*]] = load i32, ptr [[A]], align 4295; NOFASTPATH-NEXT:    ret i32 [[B]]296;297; FASTPATH-LABEL: define i32 @test_load32298; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {299; FASTPATH-NEXT:  entry:300; FASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)301; FASTPATH-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64302; FASTPATH-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56303; FASTPATH-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8304; FASTPATH-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935305; FASTPATH-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4306; FASTPATH-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]307; FASTPATH-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1308; FASTPATH-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]309; FASTPATH-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]310; FASTPATH:       8:311; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 2)312; FASTPATH-NEXT:    br label [[TMP9]]313; FASTPATH:       9:314; FASTPATH-NEXT:    [[B:%.*]] = load i32, ptr [[A]], align 4315; FASTPATH-NEXT:    ret i32 [[B]]316;317; ABORT-DYNAMIC-SHADOW-LABEL: define i32 @test_load32318; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {319; ABORT-DYNAMIC-SHADOW-NEXT:  entry:320; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)321; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 2)322; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i32, ptr [[A]], align 4323; ABORT-DYNAMIC-SHADOW-NEXT:    ret i32 [[B]]324;325; RECOVER-DYNAMIC-SHADOW-LABEL: define i32 @test_load32326; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {327; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:328; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)329; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64330; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56331; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8332; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935333; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4334; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]335; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1336; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]337; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]338; RECOVER-DYNAMIC-SHADOW:       8:339; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15340; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]341; RECOVER-DYNAMIC-SHADOW:       10:342; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "brk #2338", "{x0}"(i64 [[TMP0]])343; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]344; RECOVER-DYNAMIC-SHADOW:       11:345; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15346; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8347; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 3348; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]349; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]350; RECOVER-DYNAMIC-SHADOW:       16:351; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15352; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr353; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1354; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]355; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]356; RECOVER-DYNAMIC-SHADOW:       21:357; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]358; RECOVER-DYNAMIC-SHADOW:       22:359; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i32, ptr [[A]], align 4360; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i32 [[B]]361;362; ABORT-ZERO-BASED-SHADOW-LABEL: define i32 @test_load32363; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {364; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:365; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)366; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules.fixedshadow(ptr [[A]], i32 2, i64 0)367; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i32, ptr [[A]], align 4368; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i32 [[B]]369;370; RECOVER-ZERO-BASED-SHADOW-LABEL: define i32 @test_load32371; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {372; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:373; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)374; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64375; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56376; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8377; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935378; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4379; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr380; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1381; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]382; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]383; RECOVER-ZERO-BASED-SHADOW:       8:384; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15385; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]386; RECOVER-ZERO-BASED-SHADOW:       10:387; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "brk #2338", "{x0}"(i64 [[TMP0]])388; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]389; RECOVER-ZERO-BASED-SHADOW:       11:390; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15391; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8392; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 3393; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]394; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]395; RECOVER-ZERO-BASED-SHADOW:       16:396; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15397; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr398; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1399; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]400; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]401; RECOVER-ZERO-BASED-SHADOW:       21:402; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]403; RECOVER-ZERO-BASED-SHADOW:       22:404; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i32, ptr [[A]], align 4405; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i32 [[B]]406;407entry:408  %b = load i32, ptr %a, align 4409  ret i32 %b410}411 412define i64 @test_load64(ptr %a) sanitize_hwaddress {413; CHECK-LABEL: define i64 @test_load64414; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {415; CHECK-NEXT:  entry:416; CHECK-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)417; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 3)418; CHECK-NEXT:    [[B:%.*]] = load i64, ptr [[A]], align 8419; CHECK-NEXT:    ret i64 [[B]]420;421; NOFASTPATH-LABEL: define i64 @test_load64422; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {423; NOFASTPATH-NEXT:  entry:424; NOFASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)425; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 3)426; NOFASTPATH-NEXT:    [[B:%.*]] = load i64, ptr [[A]], align 8427; NOFASTPATH-NEXT:    ret i64 [[B]]428;429; FASTPATH-LABEL: define i64 @test_load64430; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {431; FASTPATH-NEXT:  entry:432; FASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)433; FASTPATH-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64434; FASTPATH-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56435; FASTPATH-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8436; FASTPATH-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935437; FASTPATH-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4438; FASTPATH-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]439; FASTPATH-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1440; FASTPATH-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]441; FASTPATH-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]442; FASTPATH:       8:443; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 3)444; FASTPATH-NEXT:    br label [[TMP9]]445; FASTPATH:       9:446; FASTPATH-NEXT:    [[B:%.*]] = load i64, ptr [[A]], align 8447; FASTPATH-NEXT:    ret i64 [[B]]448;449; ABORT-DYNAMIC-SHADOW-LABEL: define i64 @test_load64450; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {451; ABORT-DYNAMIC-SHADOW-NEXT:  entry:452; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)453; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 3)454; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i64, ptr [[A]], align 8455; ABORT-DYNAMIC-SHADOW-NEXT:    ret i64 [[B]]456;457; RECOVER-DYNAMIC-SHADOW-LABEL: define i64 @test_load64458; 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 "brk #2339", "{x0}"(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]], 7480; 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 i64, ptr [[A]], align 8492; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i64 [[B]]493;494; ABORT-ZERO-BASED-SHADOW-LABEL: define i64 @test_load64495; 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:    call void @llvm.hwasan.check.memaccess.shortgranules.fixedshadow(ptr [[A]], i32 3, i64 0)499; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i64, ptr [[A]], align 8500; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i64 [[B]]501;502; RECOVER-ZERO-BASED-SHADOW-LABEL: define i64 @test_load64503; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {504; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:505; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)506; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64507; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56508; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8509; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935510; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4511; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr512; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1513; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]514; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]515; RECOVER-ZERO-BASED-SHADOW:       8:516; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15517; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]518; RECOVER-ZERO-BASED-SHADOW:       10:519; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "brk #2339", "{x0}"(i64 [[TMP0]])520; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]521; RECOVER-ZERO-BASED-SHADOW:       11:522; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15523; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8524; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 7525; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]526; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]527; RECOVER-ZERO-BASED-SHADOW:       16:528; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15529; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr530; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1531; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]532; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]533; RECOVER-ZERO-BASED-SHADOW:       21:534; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]535; RECOVER-ZERO-BASED-SHADOW:       22:536; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i64, ptr [[A]], align 8537; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i64 [[B]]538;539entry:540  %b = load i64, ptr %a, align 8541  ret i64 %b542}543 544define i128 @test_load128(ptr %a) sanitize_hwaddress {545; CHECK-LABEL: define i128 @test_load128546; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {547; CHECK-NEXT:  entry:548; CHECK-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)549; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 4)550; CHECK-NEXT:    [[B:%.*]] = load i128, ptr [[A]], align 16551; CHECK-NEXT:    ret i128 [[B]]552;553; NOFASTPATH-LABEL: define i128 @test_load128554; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {555; NOFASTPATH-NEXT:  entry:556; NOFASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)557; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 4)558; NOFASTPATH-NEXT:    [[B:%.*]] = load i128, ptr [[A]], align 16559; NOFASTPATH-NEXT:    ret i128 [[B]]560;561; FASTPATH-LABEL: define i128 @test_load128562; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {563; FASTPATH-NEXT:  entry:564; FASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)565; FASTPATH-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64566; FASTPATH-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56567; FASTPATH-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8568; FASTPATH-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935569; FASTPATH-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4570; FASTPATH-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]571; FASTPATH-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1572; FASTPATH-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]573; FASTPATH-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]574; FASTPATH:       8:575; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 4)576; FASTPATH-NEXT:    br label [[TMP9]]577; FASTPATH:       9:578; FASTPATH-NEXT:    [[B:%.*]] = load i128, ptr [[A]], align 16579; FASTPATH-NEXT:    ret i128 [[B]]580;581; ABORT-DYNAMIC-SHADOW-LABEL: define i128 @test_load128582; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {583; ABORT-DYNAMIC-SHADOW-NEXT:  entry:584; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)585; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 4)586; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i128, ptr [[A]], align 16587; ABORT-DYNAMIC-SHADOW-NEXT:    ret i128 [[B]]588;589; RECOVER-DYNAMIC-SHADOW-LABEL: define i128 @test_load128590; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {591; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:592; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)593; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64594; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56595; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8596; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935597; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4598; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]599; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1600; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]601; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]602; RECOVER-DYNAMIC-SHADOW:       8:603; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15604; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]605; RECOVER-DYNAMIC-SHADOW:       10:606; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "brk #2340", "{x0}"(i64 [[TMP0]])607; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]608; RECOVER-DYNAMIC-SHADOW:       11:609; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15610; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8611; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 15612; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]613; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]614; RECOVER-DYNAMIC-SHADOW:       16:615; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15616; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr617; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1618; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]619; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]620; RECOVER-DYNAMIC-SHADOW:       21:621; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]622; RECOVER-DYNAMIC-SHADOW:       22:623; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i128, ptr [[A]], align 16624; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i128 [[B]]625;626; ABORT-ZERO-BASED-SHADOW-LABEL: define i128 @test_load128627; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {628; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:629; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)630; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules.fixedshadow(ptr [[A]], i32 4, i64 0)631; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i128, ptr [[A]], align 16632; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i128 [[B]]633;634; RECOVER-ZERO-BASED-SHADOW-LABEL: define i128 @test_load128635; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {636; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:637; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)638; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64639; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56640; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8641; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935642; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4643; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr644; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1645; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]646; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]647; RECOVER-ZERO-BASED-SHADOW:       8:648; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15649; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]650; RECOVER-ZERO-BASED-SHADOW:       10:651; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "brk #2340", "{x0}"(i64 [[TMP0]])652; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]653; RECOVER-ZERO-BASED-SHADOW:       11:654; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15655; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8656; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 15657; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]658; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]659; RECOVER-ZERO-BASED-SHADOW:       16:660; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15661; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr662; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1663; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]664; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]665; RECOVER-ZERO-BASED-SHADOW:       21:666; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]667; RECOVER-ZERO-BASED-SHADOW:       22:668; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i128, ptr [[A]], align 16669; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i128 [[B]]670;671entry:672  %b = load i128, ptr %a, align 16673  ret i128 %b674}675 676define i40 @test_load40(ptr %a) sanitize_hwaddress {677; CHECK-LABEL: define i40 @test_load40678; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {679; CHECK-NEXT:  entry:680; CHECK-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)681; CHECK-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64682; CHECK-NEXT:    call void @__hwasan_loadN(i64 [[TMP0]], i64 5)683; CHECK-NEXT:    [[B:%.*]] = load i40, ptr [[A]], align 4684; CHECK-NEXT:    ret i40 [[B]]685;686; NOFASTPATH-LABEL: define i40 @test_load40687; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {688; NOFASTPATH-NEXT:  entry:689; NOFASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)690; NOFASTPATH-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64691; NOFASTPATH-NEXT:    call void @__hwasan_loadN(i64 [[TMP0]], i64 5)692; NOFASTPATH-NEXT:    [[B:%.*]] = load i40, ptr [[A]], align 4693; NOFASTPATH-NEXT:    ret i40 [[B]]694;695; FASTPATH-LABEL: define i40 @test_load40696; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {697; FASTPATH-NEXT:  entry:698; FASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)699; FASTPATH-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64700; FASTPATH-NEXT:    call void @__hwasan_loadN(i64 [[TMP0]], i64 5)701; FASTPATH-NEXT:    [[B:%.*]] = load i40, ptr [[A]], align 4702; FASTPATH-NEXT:    ret i40 [[B]]703;704; ABORT-DYNAMIC-SHADOW-LABEL: define i40 @test_load40705; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {706; ABORT-DYNAMIC-SHADOW-NEXT:  entry:707; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)708; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64709; ABORT-DYNAMIC-SHADOW-NEXT:    call void @__hwasan_loadN(i64 [[TMP0]], i64 5)710; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i40, ptr [[A]], align 4711; ABORT-DYNAMIC-SHADOW-NEXT:    ret i40 [[B]]712;713; RECOVER-DYNAMIC-SHADOW-LABEL: define i40 @test_load40714; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {715; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:716; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)717; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64718; RECOVER-DYNAMIC-SHADOW-NEXT:    call void @__hwasan_loadN_noabort(i64 [[TMP0]], i64 5)719; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i40, ptr [[A]], align 4720; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i40 [[B]]721;722; ABORT-ZERO-BASED-SHADOW-LABEL: define i40 @test_load40723; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {724; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:725; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)726; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64727; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @__hwasan_loadN(i64 [[TMP0]], i64 5)728; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i40, ptr [[A]], align 4729; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i40 [[B]]730;731; RECOVER-ZERO-BASED-SHADOW-LABEL: define i40 @test_load40732; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR0]] {733; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:734; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)735; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64736; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void @__hwasan_loadN_noabort(i64 [[TMP0]], i64 5)737; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i40, ptr [[A]], align 4738; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i40 [[B]]739;740entry:741  %b = load i40, ptr %a, align 4742  ret i40 %b743}744 745define void @test_store8(ptr %a, i8 %b) sanitize_hwaddress {746; CHECK-LABEL: define void @test_store8747; CHECK-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {748; CHECK-NEXT:  entry:749; CHECK-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)750; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 16)751; CHECK-NEXT:    store i8 [[B]], ptr [[A]], align 4752; CHECK-NEXT:    ret void753;754; NOFASTPATH-LABEL: define void @test_store8755; NOFASTPATH-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {756; NOFASTPATH-NEXT:  entry:757; NOFASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)758; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 16)759; NOFASTPATH-NEXT:    store i8 [[B]], ptr [[A]], align 4760; NOFASTPATH-NEXT:    ret void761;762; FASTPATH-LABEL: define void @test_store8763; FASTPATH-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {764; FASTPATH-NEXT:  entry:765; FASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)766; FASTPATH-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64767; FASTPATH-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56768; FASTPATH-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8769; FASTPATH-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935770; FASTPATH-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4771; FASTPATH-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]772; FASTPATH-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1773; FASTPATH-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]774; FASTPATH-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]775; FASTPATH:       8:776; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 16)777; FASTPATH-NEXT:    br label [[TMP9]]778; FASTPATH:       9:779; FASTPATH-NEXT:    store i8 [[B]], ptr [[A]], align 4780; FASTPATH-NEXT:    ret void781;782; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store8783; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {784; ABORT-DYNAMIC-SHADOW-NEXT:  entry:785; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)786; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 16)787; ABORT-DYNAMIC-SHADOW-NEXT:    store i8 [[B]], ptr [[A]], align 4788; ABORT-DYNAMIC-SHADOW-NEXT:    ret void789;790; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store8791; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {792; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:793; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)794; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64795; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56796; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8797; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935798; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4799; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]800; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1801; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]802; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]803; RECOVER-DYNAMIC-SHADOW:       8:804; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15805; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]806; RECOVER-DYNAMIC-SHADOW:       10:807; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "brk #2352", "{x0}"(i64 [[TMP0]])808; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]809; RECOVER-DYNAMIC-SHADOW:       11:810; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15811; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8812; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 0813; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]814; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]815; RECOVER-DYNAMIC-SHADOW:       16:816; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15817; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr818; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1819; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]820; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]821; RECOVER-DYNAMIC-SHADOW:       21:822; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]823; RECOVER-DYNAMIC-SHADOW:       22:824; RECOVER-DYNAMIC-SHADOW-NEXT:    store i8 [[B]], ptr [[A]], align 4825; RECOVER-DYNAMIC-SHADOW-NEXT:    ret void826;827; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store8828; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {829; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:830; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)831; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules.fixedshadow(ptr [[A]], i32 16, i64 0)832; ABORT-ZERO-BASED-SHADOW-NEXT:    store i8 [[B]], ptr [[A]], align 4833; ABORT-ZERO-BASED-SHADOW-NEXT:    ret void834;835; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store8836; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {837; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:838; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)839; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64840; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56841; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8842; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935843; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4844; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr845; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1846; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]847; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]848; RECOVER-ZERO-BASED-SHADOW:       8:849; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15850; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]851; RECOVER-ZERO-BASED-SHADOW:       10:852; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "brk #2352", "{x0}"(i64 [[TMP0]])853; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]854; RECOVER-ZERO-BASED-SHADOW:       11:855; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15856; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8857; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 0858; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]859; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]860; RECOVER-ZERO-BASED-SHADOW:       16:861; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15862; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr863; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1864; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]865; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]866; RECOVER-ZERO-BASED-SHADOW:       21:867; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]868; RECOVER-ZERO-BASED-SHADOW:       22:869; RECOVER-ZERO-BASED-SHADOW-NEXT:    store i8 [[B]], ptr [[A]], align 4870; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret void871;872entry:873  store i8 %b, ptr %a, align 4874  ret void875}876 877define void @test_store16(ptr %a, i16 %b) sanitize_hwaddress {878; CHECK-LABEL: define void @test_store16879; CHECK-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {880; CHECK-NEXT:  entry:881; CHECK-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)882; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 17)883; CHECK-NEXT:    store i16 [[B]], ptr [[A]], align 4884; CHECK-NEXT:    ret void885;886; NOFASTPATH-LABEL: define void @test_store16887; NOFASTPATH-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {888; NOFASTPATH-NEXT:  entry:889; NOFASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)890; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 17)891; NOFASTPATH-NEXT:    store i16 [[B]], ptr [[A]], align 4892; NOFASTPATH-NEXT:    ret void893;894; FASTPATH-LABEL: define void @test_store16895; FASTPATH-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {896; FASTPATH-NEXT:  entry:897; FASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)898; FASTPATH-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64899; FASTPATH-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56900; FASTPATH-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8901; FASTPATH-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935902; FASTPATH-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4903; FASTPATH-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]904; FASTPATH-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1905; FASTPATH-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]906; FASTPATH-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]907; FASTPATH:       8:908; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 17)909; FASTPATH-NEXT:    br label [[TMP9]]910; FASTPATH:       9:911; FASTPATH-NEXT:    store i16 [[B]], ptr [[A]], align 4912; FASTPATH-NEXT:    ret void913;914; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store16915; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {916; ABORT-DYNAMIC-SHADOW-NEXT:  entry:917; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)918; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 17)919; ABORT-DYNAMIC-SHADOW-NEXT:    store i16 [[B]], ptr [[A]], align 4920; ABORT-DYNAMIC-SHADOW-NEXT:    ret void921;922; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store16923; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {924; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:925; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)926; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64927; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56928; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8929; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935930; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4931; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]932; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1933; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]934; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]935; RECOVER-DYNAMIC-SHADOW:       8:936; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15937; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]938; RECOVER-DYNAMIC-SHADOW:       10:939; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "brk #2353", "{x0}"(i64 [[TMP0]])940; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]941; RECOVER-DYNAMIC-SHADOW:       11:942; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15943; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8944; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 1945; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]946; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]947; RECOVER-DYNAMIC-SHADOW:       16:948; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15949; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr950; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1951; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]952; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]953; RECOVER-DYNAMIC-SHADOW:       21:954; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]955; RECOVER-DYNAMIC-SHADOW:       22:956; RECOVER-DYNAMIC-SHADOW-NEXT:    store i16 [[B]], ptr [[A]], align 4957; RECOVER-DYNAMIC-SHADOW-NEXT:    ret void958;959; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store16960; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {961; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:962; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)963; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules.fixedshadow(ptr [[A]], i32 17, i64 0)964; ABORT-ZERO-BASED-SHADOW-NEXT:    store i16 [[B]], ptr [[A]], align 4965; ABORT-ZERO-BASED-SHADOW-NEXT:    ret void966;967; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store16968; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {969; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:970; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)971; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i64972; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 56973; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i8974; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 72057594037927935975; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 4976; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr977; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 1978; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]979; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]980; RECOVER-ZERO-BASED-SHADOW:       8:981; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 15982; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]983; RECOVER-ZERO-BASED-SHADOW:       10:984; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "brk #2353", "{x0}"(i64 [[TMP0]])985; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]986; RECOVER-ZERO-BASED-SHADOW:       11:987; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 15988; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i8989; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 1990; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]991; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]992; RECOVER-ZERO-BASED-SHADOW:       16:993; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 15994; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr995; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 1996; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]997; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]998; RECOVER-ZERO-BASED-SHADOW:       21:999; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]1000; RECOVER-ZERO-BASED-SHADOW:       22:1001; RECOVER-ZERO-BASED-SHADOW-NEXT:    store i16 [[B]], ptr [[A]], align 41002; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret void1003;1004entry:1005  store i16 %b, ptr %a, align 41006  ret void1007}1008 1009define void @test_store32(ptr %a, i32 %b) sanitize_hwaddress {1010; CHECK-LABEL: define void @test_store321011; CHECK-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1012; CHECK-NEXT:  entry:1013; CHECK-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1014; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 18)1015; CHECK-NEXT:    store i32 [[B]], ptr [[A]], align 41016; CHECK-NEXT:    ret void1017;1018; NOFASTPATH-LABEL: define void @test_store321019; NOFASTPATH-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1020; NOFASTPATH-NEXT:  entry:1021; NOFASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1022; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 18)1023; NOFASTPATH-NEXT:    store i32 [[B]], ptr [[A]], align 41024; NOFASTPATH-NEXT:    ret void1025;1026; FASTPATH-LABEL: define void @test_store321027; FASTPATH-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1028; FASTPATH-NEXT:  entry:1029; FASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1030; FASTPATH-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641031; FASTPATH-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561032; FASTPATH-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81033; FASTPATH-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351034; FASTPATH-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41035; FASTPATH-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]1036; FASTPATH-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11037; FASTPATH-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1038; FASTPATH-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]1039; FASTPATH:       8:1040; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 18)1041; FASTPATH-NEXT:    br label [[TMP9]]1042; FASTPATH:       9:1043; FASTPATH-NEXT:    store i32 [[B]], ptr [[A]], align 41044; FASTPATH-NEXT:    ret void1045;1046; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store321047; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1048; ABORT-DYNAMIC-SHADOW-NEXT:  entry:1049; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1050; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 18)1051; ABORT-DYNAMIC-SHADOW-NEXT:    store i32 [[B]], ptr [[A]], align 41052; ABORT-DYNAMIC-SHADOW-NEXT:    ret void1053;1054; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store321055; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1056; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:1057; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1058; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641059; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561060; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81061; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351062; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41063; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]1064; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11065; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1066; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]1067; RECOVER-DYNAMIC-SHADOW:       8:1068; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 151069; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]1070; RECOVER-DYNAMIC-SHADOW:       10:1071; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "brk #2354", "{x0}"(i64 [[TMP0]])1072; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]1073; RECOVER-DYNAMIC-SHADOW:       11:1074; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 151075; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i81076; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 31077; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]1078; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]1079; RECOVER-DYNAMIC-SHADOW:       16:1080; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 151081; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr1082; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 11083; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]1084; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]1085; RECOVER-DYNAMIC-SHADOW:       21:1086; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]1087; RECOVER-DYNAMIC-SHADOW:       22:1088; RECOVER-DYNAMIC-SHADOW-NEXT:    store i32 [[B]], ptr [[A]], align 41089; RECOVER-DYNAMIC-SHADOW-NEXT:    ret void1090;1091; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store321092; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1093; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:1094; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)1095; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules.fixedshadow(ptr [[A]], i32 18, i64 0)1096; ABORT-ZERO-BASED-SHADOW-NEXT:    store i32 [[B]], ptr [[A]], align 41097; ABORT-ZERO-BASED-SHADOW-NEXT:    ret void1098;1099; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store321100; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1101; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:1102; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)1103; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641104; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561105; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81106; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351107; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41108; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr1109; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11110; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1111; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]1112; RECOVER-ZERO-BASED-SHADOW:       8:1113; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 151114; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]1115; RECOVER-ZERO-BASED-SHADOW:       10:1116; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "brk #2354", "{x0}"(i64 [[TMP0]])1117; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]1118; RECOVER-ZERO-BASED-SHADOW:       11:1119; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 151120; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i81121; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 31122; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]1123; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]1124; RECOVER-ZERO-BASED-SHADOW:       16:1125; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 151126; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr1127; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 11128; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]1129; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]1130; RECOVER-ZERO-BASED-SHADOW:       21:1131; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]1132; RECOVER-ZERO-BASED-SHADOW:       22:1133; RECOVER-ZERO-BASED-SHADOW-NEXT:    store i32 [[B]], ptr [[A]], align 41134; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret void1135;1136entry:1137  store i32 %b, ptr %a, align 41138  ret void1139}1140 1141define void @test_store64(ptr %a, i64 %b) sanitize_hwaddress {1142; CHECK-LABEL: define void @test_store641143; CHECK-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {1144; CHECK-NEXT:  entry:1145; CHECK-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1146; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 19)1147; CHECK-NEXT:    store i64 [[B]], ptr [[A]], align 81148; CHECK-NEXT:    ret void1149;1150; NOFASTPATH-LABEL: define void @test_store641151; NOFASTPATH-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {1152; NOFASTPATH-NEXT:  entry:1153; NOFASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1154; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 19)1155; NOFASTPATH-NEXT:    store i64 [[B]], ptr [[A]], align 81156; NOFASTPATH-NEXT:    ret void1157;1158; FASTPATH-LABEL: define void @test_store641159; FASTPATH-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {1160; FASTPATH-NEXT:  entry:1161; FASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1162; FASTPATH-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641163; FASTPATH-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561164; FASTPATH-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81165; FASTPATH-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351166; FASTPATH-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41167; FASTPATH-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]1168; FASTPATH-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11169; FASTPATH-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1170; FASTPATH-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]1171; FASTPATH:       8:1172; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 19)1173; FASTPATH-NEXT:    br label [[TMP9]]1174; FASTPATH:       9:1175; FASTPATH-NEXT:    store i64 [[B]], ptr [[A]], align 81176; FASTPATH-NEXT:    ret void1177;1178; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store641179; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {1180; ABORT-DYNAMIC-SHADOW-NEXT:  entry:1181; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1182; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 19)1183; ABORT-DYNAMIC-SHADOW-NEXT:    store i64 [[B]], ptr [[A]], align 81184; ABORT-DYNAMIC-SHADOW-NEXT:    ret void1185;1186; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store641187; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {1188; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:1189; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1190; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641191; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561192; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81193; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351194; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41195; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]1196; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11197; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1198; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]1199; RECOVER-DYNAMIC-SHADOW:       8:1200; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 151201; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]1202; RECOVER-DYNAMIC-SHADOW:       10:1203; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "brk #2355", "{x0}"(i64 [[TMP0]])1204; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]1205; RECOVER-DYNAMIC-SHADOW:       11:1206; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 151207; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i81208; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 71209; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]1210; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]1211; RECOVER-DYNAMIC-SHADOW:       16:1212; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 151213; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr1214; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 11215; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]1216; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]1217; RECOVER-DYNAMIC-SHADOW:       21:1218; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]1219; RECOVER-DYNAMIC-SHADOW:       22:1220; RECOVER-DYNAMIC-SHADOW-NEXT:    store i64 [[B]], ptr [[A]], align 81221; RECOVER-DYNAMIC-SHADOW-NEXT:    ret void1222;1223; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store641224; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {1225; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:1226; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)1227; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules.fixedshadow(ptr [[A]], i32 19, i64 0)1228; ABORT-ZERO-BASED-SHADOW-NEXT:    store i64 [[B]], ptr [[A]], align 81229; ABORT-ZERO-BASED-SHADOW-NEXT:    ret void1230;1231; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store641232; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {1233; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:1234; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)1235; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641236; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561237; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81238; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351239; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41240; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr1241; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11242; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1243; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]1244; RECOVER-ZERO-BASED-SHADOW:       8:1245; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 151246; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]1247; RECOVER-ZERO-BASED-SHADOW:       10:1248; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "brk #2355", "{x0}"(i64 [[TMP0]])1249; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]1250; RECOVER-ZERO-BASED-SHADOW:       11:1251; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 151252; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i81253; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 71254; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]1255; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]1256; RECOVER-ZERO-BASED-SHADOW:       16:1257; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 151258; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr1259; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 11260; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]1261; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]1262; RECOVER-ZERO-BASED-SHADOW:       21:1263; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]1264; RECOVER-ZERO-BASED-SHADOW:       22:1265; RECOVER-ZERO-BASED-SHADOW-NEXT:    store i64 [[B]], ptr [[A]], align 81266; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret void1267;1268entry:1269  store i64 %b, ptr %a, align 81270  ret void1271}1272 1273define void @test_store128(ptr %a, i128 %b) sanitize_hwaddress {1274; CHECK-LABEL: define void @test_store1281275; CHECK-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {1276; CHECK-NEXT:  entry:1277; CHECK-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1278; CHECK-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 20)1279; CHECK-NEXT:    store i128 [[B]], ptr [[A]], align 161280; CHECK-NEXT:    ret void1281;1282; NOFASTPATH-LABEL: define void @test_store1281283; NOFASTPATH-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {1284; NOFASTPATH-NEXT:  entry:1285; NOFASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1286; NOFASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 20)1287; NOFASTPATH-NEXT:    store i128 [[B]], ptr [[A]], align 161288; NOFASTPATH-NEXT:    ret void1289;1290; FASTPATH-LABEL: define void @test_store1281291; FASTPATH-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {1292; FASTPATH-NEXT:  entry:1293; FASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1294; FASTPATH-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641295; FASTPATH-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561296; FASTPATH-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81297; FASTPATH-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351298; FASTPATH-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41299; FASTPATH-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]1300; FASTPATH-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11301; FASTPATH-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1302; FASTPATH-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF2]]1303; FASTPATH:       8:1304; FASTPATH-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 20)1305; FASTPATH-NEXT:    br label [[TMP9]]1306; FASTPATH:       9:1307; FASTPATH-NEXT:    store i128 [[B]], ptr [[A]], align 161308; FASTPATH-NEXT:    ret void1309;1310; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store1281311; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {1312; ABORT-DYNAMIC-SHADOW-NEXT:  entry:1313; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1314; ABORT-DYNAMIC-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 20)1315; ABORT-DYNAMIC-SHADOW-NEXT:    store i128 [[B]], ptr [[A]], align 161316; ABORT-DYNAMIC-SHADOW-NEXT:    ret void1317;1318; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store1281319; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {1320; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:1321; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1322; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641323; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561324; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81325; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351326; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41327; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[DOTHWASAN_SHADOW]], i64 [[TMP4]]1328; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11329; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1330; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]1331; RECOVER-DYNAMIC-SHADOW:       8:1332; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 151333; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]1334; RECOVER-DYNAMIC-SHADOW:       10:1335; RECOVER-DYNAMIC-SHADOW-NEXT:    call void asm sideeffect "brk #2356", "{x0}"(i64 [[TMP0]])1336; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP21:%.*]]1337; RECOVER-DYNAMIC-SHADOW:       11:1338; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 151339; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i81340; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 151341; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]1342; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]1343; RECOVER-DYNAMIC-SHADOW:       16:1344; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 151345; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr1346; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 11347; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]1348; RECOVER-DYNAMIC-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]1349; RECOVER-DYNAMIC-SHADOW:       21:1350; RECOVER-DYNAMIC-SHADOW-NEXT:    br label [[TMP22]]1351; RECOVER-DYNAMIC-SHADOW:       22:1352; RECOVER-DYNAMIC-SHADOW-NEXT:    store i128 [[B]], ptr [[A]], align 161353; RECOVER-DYNAMIC-SHADOW-NEXT:    ret void1354;1355; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store1281356; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {1357; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:1358; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)1359; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @llvm.hwasan.check.memaccess.shortgranules.fixedshadow(ptr [[A]], i32 20, i64 0)1360; ABORT-ZERO-BASED-SHADOW-NEXT:    store i128 [[B]], ptr [[A]], align 161361; ABORT-ZERO-BASED-SHADOW-NEXT:    ret void1362;1363; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store1281364; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i128 [[B:%.*]]) #[[ATTR0]] {1365; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:1366; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)1367; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641368; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP1:%.*]] = lshr i64 [[TMP0]], 561369; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i81370; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP3:%.*]] = and i64 [[TMP0]], 720575940379279351371; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP4:%.*]] = lshr i64 [[TMP3]], 41372; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr1373; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 11374; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP7:%.*]] = icmp ne i8 [[TMP2]], [[TMP6]]1375; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP22:%.*]], !prof [[PROF2]]1376; RECOVER-ZERO-BASED-SHADOW:       8:1377; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP9:%.*]] = icmp ugt i8 [[TMP6]], 151378; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF2]]1379; RECOVER-ZERO-BASED-SHADOW:       10:1380; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void asm sideeffect "brk #2356", "{x0}"(i64 [[TMP0]])1381; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP21:%.*]]1382; RECOVER-ZERO-BASED-SHADOW:       11:1383; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP12:%.*]] = and i64 [[TMP0]], 151384; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP13:%.*]] = trunc i64 [[TMP12]] to i81385; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP14:%.*]] = add i8 [[TMP13]], 151386; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP15:%.*]] = icmp uge i8 [[TMP14]], [[TMP6]]1387; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP15]], label [[TMP10]], label [[TMP16:%.*]], !prof [[PROF2]]1388; RECOVER-ZERO-BASED-SHADOW:       16:1389; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP17:%.*]] = or i64 [[TMP3]], 151390; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr1391; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP19:%.*]] = load i8, ptr [[TMP18]], align 11392; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP20:%.*]] = icmp ne i8 [[TMP2]], [[TMP19]]1393; RECOVER-ZERO-BASED-SHADOW-NEXT:    br i1 [[TMP20]], label [[TMP10]], label [[TMP21]], !prof [[PROF2]]1394; RECOVER-ZERO-BASED-SHADOW:       21:1395; RECOVER-ZERO-BASED-SHADOW-NEXT:    br label [[TMP22]]1396; RECOVER-ZERO-BASED-SHADOW:       22:1397; RECOVER-ZERO-BASED-SHADOW-NEXT:    store i128 [[B]], ptr [[A]], align 161398; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret void1399;1400entry:1401  store i128 %b, ptr %a, align 161402  ret void1403}1404 1405define void @test_store40(ptr %a, i40 %b) sanitize_hwaddress {1406; CHECK-LABEL: define void @test_store401407; CHECK-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {1408; CHECK-NEXT:  entry:1409; CHECK-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1410; CHECK-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641411; CHECK-NEXT:    call void @__hwasan_storeN(i64 [[TMP0]], i64 5)1412; CHECK-NEXT:    store i40 [[B]], ptr [[A]], align 41413; CHECK-NEXT:    ret void1414;1415; NOFASTPATH-LABEL: define void @test_store401416; NOFASTPATH-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {1417; NOFASTPATH-NEXT:  entry:1418; NOFASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1419; NOFASTPATH-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641420; NOFASTPATH-NEXT:    call void @__hwasan_storeN(i64 [[TMP0]], i64 5)1421; NOFASTPATH-NEXT:    store i40 [[B]], ptr [[A]], align 41422; NOFASTPATH-NEXT:    ret void1423;1424; FASTPATH-LABEL: define void @test_store401425; FASTPATH-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {1426; FASTPATH-NEXT:  entry:1427; FASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1428; FASTPATH-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641429; FASTPATH-NEXT:    call void @__hwasan_storeN(i64 [[TMP0]], i64 5)1430; FASTPATH-NEXT:    store i40 [[B]], ptr [[A]], align 41431; FASTPATH-NEXT:    ret void1432;1433; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store401434; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {1435; ABORT-DYNAMIC-SHADOW-NEXT:  entry:1436; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1437; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641438; ABORT-DYNAMIC-SHADOW-NEXT:    call void @__hwasan_storeN(i64 [[TMP0]], i64 5)1439; ABORT-DYNAMIC-SHADOW-NEXT:    store i40 [[B]], ptr [[A]], align 41440; ABORT-DYNAMIC-SHADOW-NEXT:    ret void1441;1442; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store401443; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {1444; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:1445; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1446; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641447; RECOVER-DYNAMIC-SHADOW-NEXT:    call void @__hwasan_storeN_noabort(i64 [[TMP0]], i64 5)1448; RECOVER-DYNAMIC-SHADOW-NEXT:    store i40 [[B]], ptr [[A]], align 41449; RECOVER-DYNAMIC-SHADOW-NEXT:    ret void1450;1451; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store401452; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {1453; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:1454; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)1455; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641456; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @__hwasan_storeN(i64 [[TMP0]], i64 5)1457; ABORT-ZERO-BASED-SHADOW-NEXT:    store i40 [[B]], ptr [[A]], align 41458; ABORT-ZERO-BASED-SHADOW-NEXT:    ret void1459;1460; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store401461; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i40 [[B:%.*]]) #[[ATTR0]] {1462; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:1463; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)1464; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641465; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void @__hwasan_storeN_noabort(i64 [[TMP0]], i64 5)1466; RECOVER-ZERO-BASED-SHADOW-NEXT:    store i40 [[B]], ptr [[A]], align 41467; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret void1468;1469entry:1470  store i40 %b, ptr %a, align 41471  ret void1472}1473 1474define void @test_store_unaligned(ptr %a, i64 %b) sanitize_hwaddress {1475; CHECK-LABEL: define void @test_store_unaligned1476; CHECK-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {1477; CHECK-NEXT:  entry:1478; CHECK-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1479; CHECK-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641480; CHECK-NEXT:    call void @__hwasan_storeN(i64 [[TMP0]], i64 8)1481; CHECK-NEXT:    store i64 [[B]], ptr [[A]], align 41482; CHECK-NEXT:    ret void1483;1484; NOFASTPATH-LABEL: define void @test_store_unaligned1485; NOFASTPATH-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {1486; NOFASTPATH-NEXT:  entry:1487; NOFASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1488; NOFASTPATH-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641489; NOFASTPATH-NEXT:    call void @__hwasan_storeN(i64 [[TMP0]], i64 8)1490; NOFASTPATH-NEXT:    store i64 [[B]], ptr [[A]], align 41491; NOFASTPATH-NEXT:    ret void1492;1493; FASTPATH-LABEL: define void @test_store_unaligned1494; FASTPATH-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {1495; FASTPATH-NEXT:  entry:1496; FASTPATH-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1497; FASTPATH-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641498; FASTPATH-NEXT:    call void @__hwasan_storeN(i64 [[TMP0]], i64 8)1499; FASTPATH-NEXT:    store i64 [[B]], ptr [[A]], align 41500; FASTPATH-NEXT:    ret void1501;1502; ABORT-DYNAMIC-SHADOW-LABEL: define void @test_store_unaligned1503; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {1504; ABORT-DYNAMIC-SHADOW-NEXT:  entry:1505; ABORT-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1506; ABORT-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641507; ABORT-DYNAMIC-SHADOW-NEXT:    call void @__hwasan_storeN(i64 [[TMP0]], i64 8)1508; ABORT-DYNAMIC-SHADOW-NEXT:    store i64 [[B]], ptr [[A]], align 41509; ABORT-DYNAMIC-SHADOW-NEXT:    ret void1510;1511; RECOVER-DYNAMIC-SHADOW-LABEL: define void @test_store_unaligned1512; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {1513; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:1514; RECOVER-DYNAMIC-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)1515; RECOVER-DYNAMIC-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641516; RECOVER-DYNAMIC-SHADOW-NEXT:    call void @__hwasan_storeN_noabort(i64 [[TMP0]], i64 8)1517; RECOVER-DYNAMIC-SHADOW-NEXT:    store i64 [[B]], ptr [[A]], align 41518; RECOVER-DYNAMIC-SHADOW-NEXT:    ret void1519;1520; ABORT-ZERO-BASED-SHADOW-LABEL: define void @test_store_unaligned1521; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {1522; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:1523; ABORT-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)1524; ABORT-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641525; ABORT-ZERO-BASED-SHADOW-NEXT:    call void @__hwasan_storeN(i64 [[TMP0]], i64 8)1526; ABORT-ZERO-BASED-SHADOW-NEXT:    store i64 [[B]], ptr [[A]], align 41527; ABORT-ZERO-BASED-SHADOW-NEXT:    ret void1528;1529; RECOVER-ZERO-BASED-SHADOW-LABEL: define void @test_store_unaligned1530; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {1531; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:1532; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr null)1533; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[A]] to i641534; RECOVER-ZERO-BASED-SHADOW-NEXT:    call void @__hwasan_storeN_noabort(i64 [[TMP0]], i64 8)1535; RECOVER-ZERO-BASED-SHADOW-NEXT:    store i64 [[B]], ptr [[A]], align 41536; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret void1537;1538entry:1539  store i64 %b, ptr %a, align 41540  ret void1541}1542 1543define i8 @test_load_noattr(ptr %a) {1544; CHECK-LABEL: define i8 @test_load_noattr1545; CHECK-SAME: (ptr [[A:%.*]]) {1546; CHECK-NEXT:  entry:1547; CHECK-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 41548; CHECK-NEXT:    ret i8 [[B]]1549;1550; NOFASTPATH-LABEL: define i8 @test_load_noattr1551; NOFASTPATH-SAME: (ptr [[A:%.*]]) {1552; NOFASTPATH-NEXT:  entry:1553; NOFASTPATH-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 41554; NOFASTPATH-NEXT:    ret i8 [[B]]1555;1556; FASTPATH-LABEL: define i8 @test_load_noattr1557; FASTPATH-SAME: (ptr [[A:%.*]]) {1558; FASTPATH-NEXT:  entry:1559; FASTPATH-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 41560; FASTPATH-NEXT:    ret i8 [[B]]1561;1562; ABORT-DYNAMIC-SHADOW-LABEL: define i8 @test_load_noattr1563; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) {1564; ABORT-DYNAMIC-SHADOW-NEXT:  entry:1565; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 41566; ABORT-DYNAMIC-SHADOW-NEXT:    ret i8 [[B]]1567;1568; RECOVER-DYNAMIC-SHADOW-LABEL: define i8 @test_load_noattr1569; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) {1570; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:1571; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 41572; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i8 [[B]]1573;1574; ABORT-ZERO-BASED-SHADOW-LABEL: define i8 @test_load_noattr1575; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) {1576; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:1577; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 41578; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i8 [[B]]1579;1580; RECOVER-ZERO-BASED-SHADOW-LABEL: define i8 @test_load_noattr1581; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) {1582; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:1583; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 41584; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i8 [[B]]1585;1586entry:1587  %b = load i8, ptr %a, align 41588  ret i8 %b1589}1590 1591define i8 @test_load_notmyattr(ptr %a) sanitize_address {1592; CHECK-LABEL: define i8 @test_load_notmyattr1593; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {1594; CHECK-NEXT:  entry:1595; CHECK-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 41596; CHECK-NEXT:    ret i8 [[B]]1597;1598; NOFASTPATH-LABEL: define i8 @test_load_notmyattr1599; NOFASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {1600; NOFASTPATH-NEXT:  entry:1601; NOFASTPATH-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 41602; NOFASTPATH-NEXT:    ret i8 [[B]]1603;1604; FASTPATH-LABEL: define i8 @test_load_notmyattr1605; FASTPATH-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {1606; FASTPATH-NEXT:  entry:1607; FASTPATH-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 41608; FASTPATH-NEXT:    ret i8 [[B]]1609;1610; ABORT-DYNAMIC-SHADOW-LABEL: define i8 @test_load_notmyattr1611; ABORT-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {1612; ABORT-DYNAMIC-SHADOW-NEXT:  entry:1613; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 41614; ABORT-DYNAMIC-SHADOW-NEXT:    ret i8 [[B]]1615;1616; RECOVER-DYNAMIC-SHADOW-LABEL: define i8 @test_load_notmyattr1617; RECOVER-DYNAMIC-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {1618; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:1619; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 41620; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i8 [[B]]1621;1622; ABORT-ZERO-BASED-SHADOW-LABEL: define i8 @test_load_notmyattr1623; ABORT-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {1624; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:1625; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 41626; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i8 [[B]]1627;1628; RECOVER-ZERO-BASED-SHADOW-LABEL: define i8 @test_load_notmyattr1629; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr [[A:%.*]]) #[[ATTR1:[0-9]+]] {1630; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:1631; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr [[A]], align 41632; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i8 [[B]]1633;1634entry:1635  %b = load i8, ptr %a, align 41636  ret i8 %b1637}1638 1639define i8 @test_load_addrspace(ptr addrspace(256) %a) sanitize_hwaddress {1640; CHECK-LABEL: define i8 @test_load_addrspace1641; CHECK-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {1642; CHECK-NEXT:  entry:1643; CHECK-NEXT:    [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 41644; CHECK-NEXT:    ret i8 [[B]]1645;1646; NOFASTPATH-LABEL: define i8 @test_load_addrspace1647; NOFASTPATH-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {1648; NOFASTPATH-NEXT:  entry:1649; NOFASTPATH-NEXT:    [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 41650; NOFASTPATH-NEXT:    ret i8 [[B]]1651;1652; FASTPATH-LABEL: define i8 @test_load_addrspace1653; FASTPATH-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {1654; FASTPATH-NEXT:  entry:1655; FASTPATH-NEXT:    [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 41656; FASTPATH-NEXT:    ret i8 [[B]]1657;1658; ABORT-DYNAMIC-SHADOW-LABEL: define i8 @test_load_addrspace1659; ABORT-DYNAMIC-SHADOW-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {1660; ABORT-DYNAMIC-SHADOW-NEXT:  entry:1661; ABORT-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 41662; ABORT-DYNAMIC-SHADOW-NEXT:    ret i8 [[B]]1663;1664; RECOVER-DYNAMIC-SHADOW-LABEL: define i8 @test_load_addrspace1665; RECOVER-DYNAMIC-SHADOW-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {1666; RECOVER-DYNAMIC-SHADOW-NEXT:  entry:1667; RECOVER-DYNAMIC-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 41668; RECOVER-DYNAMIC-SHADOW-NEXT:    ret i8 [[B]]1669;1670; ABORT-ZERO-BASED-SHADOW-LABEL: define i8 @test_load_addrspace1671; ABORT-ZERO-BASED-SHADOW-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {1672; ABORT-ZERO-BASED-SHADOW-NEXT:  entry:1673; ABORT-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 41674; ABORT-ZERO-BASED-SHADOW-NEXT:    ret i8 [[B]]1675;1676; RECOVER-ZERO-BASED-SHADOW-LABEL: define i8 @test_load_addrspace1677; RECOVER-ZERO-BASED-SHADOW-SAME: (ptr addrspace(256) [[A:%.*]]) #[[ATTR0]] {1678; RECOVER-ZERO-BASED-SHADOW-NEXT:  entry:1679; RECOVER-ZERO-BASED-SHADOW-NEXT:    [[B:%.*]] = load i8, ptr addrspace(256) [[A]], align 41680; RECOVER-ZERO-BASED-SHADOW-NEXT:    ret i8 [[B]]1681;1682entry:1683  %b = load i8, ptr addrspace(256) %a, align 41684  ret i8 %b1685}1686