llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-backend-risc-v Author: Florian Mayer (fmayer) <details> <summary>Changes</summary> --- Full diff: https://github.com/llvm/llvm-project/pull/181438.diff 4 Files Affected: - (modified) llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp (+27-12) - (modified) llvm/test/Instrumentation/HWAddressSanitizer/RISCV/use-after-scope-setjmp.ll (+18-6) - (modified) llvm/test/Instrumentation/HWAddressSanitizer/use-after-scope-setjmp.ll (+18-6) - (modified) llvm/test/Instrumentation/HWAddressSanitizer/use-after-scope.ll (+62) ``````````diff diff --git a/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp index 92223dc5bc8fe..fcad2705cf584 100644 --- a/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp @@ -152,6 +152,11 @@ static cl::opt<bool> cl::desc("detect use after scope within function"), cl::Hidden, cl::init(true)); +static cl::opt<bool> ClStrictUseAfterScope( + "hwasan-strict-use-after-scope", + cl::desc("for complicated lifetimes, tag both on end and return"), + cl::Hidden, cl::init(true)); + static cl::opt<bool> ClGenerateTagsWithCalls( "hwasan-generate-tags-with-calls", cl::desc("generate new tags with runtime library calls"), cl::Hidden, @@ -1496,6 +1501,12 @@ void HWAddressSanitizer::instrumentStack(memtag::StackInfo &SInfo, memtag::annotateDebugRecords(Info, retagMask(N)); + auto TagStarts = [&]() { + for (IntrinsicInst *Start : Info.LifetimeStart) { + IRB.SetInsertPoint(Start->getNextNode()); + tagAlloca(IRB, AI, Tag, Size); + } + }; auto TagEnd = [&](Instruction *Node) { IRB.SetInsertPoint(Node); // When untagging, use the `AlignedSize` because we need to set the tags @@ -1504,31 +1515,35 @@ void HWAddressSanitizer::instrumentStack(memtag::StackInfo &SInfo, // last granule, due to how short granules are implemented. tagAlloca(IRB, AI, UARTag, AlignedSize); }; + auto EraseLifetimes = [&]() { + for (auto &II : Info.LifetimeStart) + II->eraseFromParent(); + for (auto &II : Info.LifetimeEnd) + II->eraseFromParent(); + }; // Calls to functions that may return twice (e.g. setjmp) confuse the // postdominator analysis, and will leave us to keep memory tagged after // function return. Work around this by always untagging at every return // statement if return_twice functions are called. if (DetectUseAfterScope && !SInfo.CallsReturnTwice && memtag::isStandardLifetime(Info, &DT, &LI, ClMaxLifetimes)) { - for (IntrinsicInst *Start : Info.LifetimeStart) { - IRB.SetInsertPoint(Start->getNextNode()); - tagAlloca(IRB, AI, Tag, Size); - } + TagStarts(); if (!memtag::forAllReachableExits(DT, PDT, LI, Info, SInfo.RetVec, TagEnd)) { for (auto *End : Info.LifetimeEnd) End->eraseFromParent(); } + } else if (DetectUseAfterScope && ClStrictUseAfterScope) { + // SInfo.CallsReturnTwice || !isStandardLifetime + tagAlloca(IRB, AI, Tag, Size); + TagStarts(); + for_each(Info.LifetimeEnd, TagEnd); + for_each(SInfo.RetVec, TagEnd); + EraseLifetimes(); } else { tagAlloca(IRB, AI, Tag, Size); - for (auto *RI : SInfo.RetVec) - TagEnd(RI); - // We inserted tagging outside of the lifetimes, so we have to remove - // them. - for (auto &II : Info.LifetimeStart) - II->eraseFromParent(); - for (auto &II : Info.LifetimeEnd) - II->eraseFromParent(); + for_each(SInfo.RetVec, TagEnd); + EraseLifetimes(); } memtag::alignAndPadAlloca(Info, Mapping.getObjectAlignment()); } diff --git a/llvm/test/Instrumentation/HWAddressSanitizer/RISCV/use-after-scope-setjmp.ll b/llvm/test/Instrumentation/HWAddressSanitizer/RISCV/use-after-scope-setjmp.ll index acea906d26b1c..fb7adf05e9cef 100644 --- a/llvm/test/Instrumentation/HWAddressSanitizer/RISCV/use-after-scope-setjmp.ll +++ b/llvm/test/Instrumentation/HWAddressSanitizer/RISCV/use-after-scope-setjmp.ll @@ -52,18 +52,30 @@ define dso_local noundef i1 @_Z6targetv() sanitize_hwaddress { ; CHECK: sw.bb1: ; CHECK-NEXT: br label [[RETURN]] ; CHECK: while.body: +; CHECK-NEXT: [[TMP25:%.*]] = trunc i64 [[TMP15]] to i8 +; CHECK-NEXT: [[TMP26:%.*]] = ptrtoint ptr [[BUF]] to i64 +; CHECK-NEXT: [[TMP27:%.*]] = and i64 [[TMP26]], 72057594037927935 +; CHECK-NEXT: [[TMP28:%.*]] = lshr i64 [[TMP27]], 4 +; CHECK-NEXT: [[TMP29:%.*]] = getelementptr i8, ptr [[TMP14]], i64 [[TMP28]] +; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[TMP29]], i8 [[TMP25]], i64 256, i1 false) ; CHECK-NEXT: call void @llvm.hwasan.check.memaccess.shortgranules(ptr [[TMP14]], ptr @stackbuf, i32 19) ; CHECK-NEXT: store ptr [[BUF_HWASAN]], ptr @stackbuf, align 8 ; CHECK-NEXT: call void @may_jump() +; CHECK-NEXT: [[TMP30:%.*]] = trunc i64 [[HWASAN_UAR_TAG]] to i8 +; CHECK-NEXT: [[TMP31:%.*]] = ptrtoint ptr [[BUF]] to i64 +; CHECK-NEXT: [[TMP32:%.*]] = and i64 [[TMP31]], 72057594037927935 +; CHECK-NEXT: [[TMP33:%.*]] = lshr i64 [[TMP32]], 4 +; CHECK-NEXT: [[TMP34:%.*]] = getelementptr i8, ptr [[TMP14]], i64 [[TMP33]] +; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[TMP34]], i8 [[TMP30]], i64 256, i1 false) ; CHECK-NEXT: br label [[RETURN]] ; CHECK: return: ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i1 [ true, [[WHILE_BODY]] ], [ true, [[SW_BB1]] ], [ false, [[ENTRY:%.*]] ] -; CHECK-NEXT: [[TMP25:%.*]] = trunc i64 [[HWASAN_UAR_TAG]] to i8 -; CHECK-NEXT: [[TMP26:%.*]] = ptrtoint ptr [[BUF]] to i64 -; CHECK-NEXT: [[TMP27:%.*]] = and i64 [[TMP26]], 72057594037927935 -; CHECK-NEXT: [[TMP28:%.*]] = lshr i64 [[TMP27]], 4 -; CHECK-NEXT: [[TMP29:%.*]] = getelementptr i8, ptr [[TMP14]], i64 [[TMP28]] -; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[TMP29]], i8 [[TMP25]], i64 256, i1 false) +; CHECK-NEXT: [[TMP35:%.*]] = trunc i64 [[HWASAN_UAR_TAG]] to i8 +; CHECK-NEXT: [[TMP36:%.*]] = ptrtoint ptr [[BUF]] to i64 +; CHECK-NEXT: [[TMP37:%.*]] = and i64 [[TMP36]], 72057594037927935 +; CHECK-NEXT: [[TMP38:%.*]] = lshr i64 [[TMP37]], 4 +; CHECK-NEXT: [[TMP39:%.*]] = getelementptr i8, ptr [[TMP14]], i64 [[TMP38]] +; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[TMP39]], i8 [[TMP35]], i64 256, i1 false) ; CHECK-NEXT: ret i1 [[RETVAL_0]] ; entry: diff --git a/llvm/test/Instrumentation/HWAddressSanitizer/use-after-scope-setjmp.ll b/llvm/test/Instrumentation/HWAddressSanitizer/use-after-scope-setjmp.ll index 9336a17fadb8d..17f8450bccd43 100644 --- a/llvm/test/Instrumentation/HWAddressSanitizer/use-after-scope-setjmp.ll +++ b/llvm/test/Instrumentation/HWAddressSanitizer/use-after-scope-setjmp.ll @@ -54,17 +54,29 @@ define dso_local noundef i1 @_Z6targetv() sanitize_hwaddress { ; CHECK: sw.bb1: ; CHECK-NEXT: br label [[RETURN]] ; CHECK: while.body: -; CHECK-NEXT: store ptr [[BUF_HWASAN]], ptr @stackbuf, align 8 -; CHECK-NEXT: call void @may_jump() -; CHECK-NEXT: br label [[RETURN]] -; CHECK: return: -; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i1 [ true, [[WHILE_BODY]] ], [ true, [[SW_BB1]] ], [ false, [[ENTRY:%.*]] ] -; CHECK-NEXT: [[TMP27:%.*]] = trunc i64 [[HWASAN_UAR_TAG]] to i8 +; CHECK-NEXT: [[TMP27:%.*]] = trunc i64 [[TMP17]] to i8 ; CHECK-NEXT: [[TMP28:%.*]] = ptrtoint ptr [[BUF]] to i64 ; CHECK-NEXT: [[TMP29:%.*]] = and i64 [[TMP28]], 72057594037927935 ; CHECK-NEXT: [[TMP30:%.*]] = lshr i64 [[TMP29]], 4 ; CHECK-NEXT: [[TMP31:%.*]] = getelementptr i8, ptr [[TMP16]], i64 [[TMP30]] ; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[TMP31]], i8 [[TMP27]], i64 256, i1 false) +; CHECK-NEXT: store ptr [[BUF_HWASAN]], ptr @stackbuf, align 8 +; CHECK-NEXT: call void @may_jump() +; CHECK-NEXT: [[TMP32:%.*]] = trunc i64 [[HWASAN_UAR_TAG]] to i8 +; CHECK-NEXT: [[TMP33:%.*]] = ptrtoint ptr [[BUF]] to i64 +; CHECK-NEXT: [[TMP34:%.*]] = and i64 [[TMP33]], 72057594037927935 +; CHECK-NEXT: [[TMP35:%.*]] = lshr i64 [[TMP34]], 4 +; CHECK-NEXT: [[TMP36:%.*]] = getelementptr i8, ptr [[TMP16]], i64 [[TMP35]] +; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[TMP36]], i8 [[TMP32]], i64 256, i1 false) +; CHECK-NEXT: br label [[RETURN]] +; CHECK: return: +; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i1 [ true, [[WHILE_BODY]] ], [ true, [[SW_BB1]] ], [ false, [[ENTRY:%.*]] ] +; CHECK-NEXT: [[TMP37:%.*]] = trunc i64 [[HWASAN_UAR_TAG]] to i8 +; CHECK-NEXT: [[TMP38:%.*]] = ptrtoint ptr [[BUF]] to i64 +; CHECK-NEXT: [[TMP39:%.*]] = and i64 [[TMP38]], 72057594037927935 +; CHECK-NEXT: [[TMP40:%.*]] = lshr i64 [[TMP39]], 4 +; CHECK-NEXT: [[TMP41:%.*]] = getelementptr i8, ptr [[TMP16]], i64 [[TMP40]] +; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[TMP41]], i8 [[TMP37]], i64 256, i1 false) ; CHECK-NEXT: ret i1 [[RETVAL_0]] ; entry: diff --git a/llvm/test/Instrumentation/HWAddressSanitizer/use-after-scope.ll b/llvm/test/Instrumentation/HWAddressSanitizer/use-after-scope.ll index 7a04af402a67a..b56325ce632a7 100644 --- a/llvm/test/Instrumentation/HWAddressSanitizer/use-after-scope.ll +++ b/llvm/test/Instrumentation/HWAddressSanitizer/use-after-scope.ll @@ -588,10 +588,18 @@ define dso_local i32 @multiple_lifetimes() local_unnamed_addr sanitize_hwaddress ; X86-SCOPE-NEXT: [[ALLOCA_0_HWASAN:%.*]] = inttoptr i64 [[TMP10]] to ptr ; X86-SCOPE-NEXT: [[TMP11:%.*]] = trunc i64 [[TMP6]] to i8 ; X86-SCOPE-NEXT: call void @__hwasan_tag_memory(ptr [[TMP4]], i8 [[TMP11]], i64 16) +; X86-SCOPE-NEXT: [[TMP16:%.*]] = trunc i64 [[TMP6]] to i8 +; X86-SCOPE-NEXT: call void @__hwasan_tag_memory(ptr [[TMP4]], i8 [[TMP16]], i64 16) ; X86-SCOPE-NEXT: call void @use(ptr nonnull [[ALLOCA_0_HWASAN]]) +; X86-SCOPE-NEXT: [[TMP12:%.*]] = trunc i64 [[HWASAN_UAR_TAG]] to i8 +; X86-SCOPE-NEXT: call void @__hwasan_tag_memory(ptr [[TMP4]], i8 [[TMP12]], i64 16) +; X86-SCOPE-NEXT: [[TMP14:%.*]] = trunc i64 [[TMP6]] to i8 +; X86-SCOPE-NEXT: call void @__hwasan_tag_memory(ptr [[TMP4]], i8 [[TMP14]], i64 16) ; X86-SCOPE-NEXT: call void @use(ptr nonnull [[ALLOCA_0_HWASAN]]) ; X86-SCOPE-NEXT: [[TMP13:%.*]] = trunc i64 [[HWASAN_UAR_TAG]] to i8 ; X86-SCOPE-NEXT: call void @__hwasan_tag_memory(ptr [[TMP4]], i8 [[TMP13]], i64 16) +; X86-SCOPE-NEXT: [[TMP15:%.*]] = trunc i64 [[HWASAN_UAR_TAG]] to i8 +; X86-SCOPE-NEXT: call void @__hwasan_tag_memory(ptr [[TMP4]], i8 [[TMP15]], i64 16) ; X86-SCOPE-NEXT: ret i32 0 ; ; X86-NOSCOPE-LABEL: @multiple_lifetimes( @@ -652,7 +660,25 @@ define dso_local i32 @multiple_lifetimes() local_unnamed_addr sanitize_hwaddress ; AARCH64-SCOPE-NEXT: [[TMP28:%.*]] = lshr i64 [[TMP27]], 4 ; AARCH64-SCOPE-NEXT: [[TMP29:%.*]] = getelementptr i8, ptr [[TMP17]], i64 [[TMP28]] ; AARCH64-SCOPE-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[TMP29]], i8 [[TMP25]], i64 1, i1 false) +; AARCH64-SCOPE-NEXT: [[TMP50:%.*]] = trunc i64 [[TMP20]] to i8 +; AARCH64-SCOPE-NEXT: [[TMP51:%.*]] = ptrtoint ptr [[TMP18]] to i64 +; AARCH64-SCOPE-NEXT: [[TMP52:%.*]] = and i64 [[TMP51]], 72057594037927935 +; AARCH64-SCOPE-NEXT: [[TMP53:%.*]] = lshr i64 [[TMP52]], 4 +; AARCH64-SCOPE-NEXT: [[TMP54:%.*]] = getelementptr i8, ptr [[TMP17]], i64 [[TMP53]] +; AARCH64-SCOPE-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[TMP54]], i8 [[TMP50]], i64 1, i1 false) ; AARCH64-SCOPE-NEXT: call void @use(ptr nonnull [[ALLOCA_0_HWASAN]]) +; AARCH64-SCOPE-NEXT: [[TMP30:%.*]] = trunc i64 [[HWASAN_UAR_TAG]] to i8 +; AARCH64-SCOPE-NEXT: [[TMP31:%.*]] = ptrtoint ptr [[TMP18]] to i64 +; AARCH64-SCOPE-NEXT: [[TMP32:%.*]] = and i64 [[TMP31]], 72057594037927935 +; AARCH64-SCOPE-NEXT: [[TMP33:%.*]] = lshr i64 [[TMP32]], 4 +; AARCH64-SCOPE-NEXT: [[TMP34:%.*]] = getelementptr i8, ptr [[TMP17]], i64 [[TMP33]] +; AARCH64-SCOPE-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[TMP34]], i8 [[TMP30]], i64 1, i1 false) +; AARCH64-SCOPE-NEXT: [[TMP40:%.*]] = trunc i64 [[TMP20]] to i8 +; AARCH64-SCOPE-NEXT: [[TMP41:%.*]] = ptrtoint ptr [[TMP18]] to i64 +; AARCH64-SCOPE-NEXT: [[TMP42:%.*]] = and i64 [[TMP41]], 72057594037927935 +; AARCH64-SCOPE-NEXT: [[TMP43:%.*]] = lshr i64 [[TMP42]], 4 +; AARCH64-SCOPE-NEXT: [[TMP44:%.*]] = getelementptr i8, ptr [[TMP17]], i64 [[TMP43]] +; AARCH64-SCOPE-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[TMP44]], i8 [[TMP40]], i64 1, i1 false) ; AARCH64-SCOPE-NEXT: call void @use(ptr nonnull [[ALLOCA_0_HWASAN]]) ; AARCH64-SCOPE-NEXT: [[TMP35:%.*]] = trunc i64 [[HWASAN_UAR_TAG]] to i8 ; AARCH64-SCOPE-NEXT: [[TMP36:%.*]] = ptrtoint ptr [[TMP18]] to i64 @@ -660,6 +686,12 @@ define dso_local i32 @multiple_lifetimes() local_unnamed_addr sanitize_hwaddress ; AARCH64-SCOPE-NEXT: [[TMP38:%.*]] = lshr i64 [[TMP37]], 4 ; AARCH64-SCOPE-NEXT: [[TMP39:%.*]] = getelementptr i8, ptr [[TMP17]], i64 [[TMP38]] ; AARCH64-SCOPE-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[TMP39]], i8 [[TMP35]], i64 1, i1 false) +; AARCH64-SCOPE-NEXT: [[TMP45:%.*]] = trunc i64 [[HWASAN_UAR_TAG]] to i8 +; AARCH64-SCOPE-NEXT: [[TMP46:%.*]] = ptrtoint ptr [[TMP18]] to i64 +; AARCH64-SCOPE-NEXT: [[TMP47:%.*]] = and i64 [[TMP46]], 72057594037927935 +; AARCH64-SCOPE-NEXT: [[TMP48:%.*]] = lshr i64 [[TMP47]], 4 +; AARCH64-SCOPE-NEXT: [[TMP49:%.*]] = getelementptr i8, ptr [[TMP17]], i64 [[TMP48]] +; AARCH64-SCOPE-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[TMP49]], i8 [[TMP45]], i64 1, i1 false) ; AARCH64-SCOPE-NEXT: ret i32 0 ; ; AARCH64-NOSCOPE-LABEL: @multiple_lifetimes( @@ -747,7 +779,31 @@ define dso_local i32 @multiple_lifetimes() local_unnamed_addr sanitize_hwaddress ; AARCH64-SHORT-SCOPE-NEXT: store i8 1, ptr [[TMP30]], align 1 ; AARCH64-SHORT-SCOPE-NEXT: [[TMP31:%.*]] = getelementptr i8, ptr [[TMP18]], i32 15 ; AARCH64-SHORT-SCOPE-NEXT: store i8 [[TMP25]], ptr [[TMP31]], align 1 +; AARCH64-SHORT-SCOPE-NEXT: [[TMP54:%.*]] = trunc i64 [[TMP20]] to i8 +; AARCH64-SHORT-SCOPE-NEXT: [[TMP55:%.*]] = ptrtoint ptr [[TMP18]] to i64 +; AARCH64-SHORT-SCOPE-NEXT: [[TMP56:%.*]] = and i64 [[TMP55]], 72057594037927935 +; AARCH64-SHORT-SCOPE-NEXT: [[TMP57:%.*]] = lshr i64 [[TMP56]], 4 +; AARCH64-SHORT-SCOPE-NEXT: [[TMP58:%.*]] = getelementptr i8, ptr [[TMP17]], i64 [[TMP57]] +; AARCH64-SHORT-SCOPE-NEXT: [[TMP59:%.*]] = getelementptr i8, ptr [[TMP58]], i32 0 +; AARCH64-SHORT-SCOPE-NEXT: store i8 1, ptr [[TMP59]], align 1 +; AARCH64-SHORT-SCOPE-NEXT: [[TMP60:%.*]] = getelementptr i8, ptr [[TMP18]], i32 15 +; AARCH64-SHORT-SCOPE-NEXT: store i8 [[TMP54]], ptr [[TMP60]], align 1 ; AARCH64-SHORT-SCOPE-NEXT: call void @use(ptr nonnull [[ALLOCA_0_HWASAN]]) +; AARCH64-SHORT-SCOPE-NEXT: [[TMP44:%.*]] = trunc i64 [[HWASAN_UAR_TAG]] to i8 +; AARCH64-SHORT-SCOPE-NEXT: [[TMP45:%.*]] = ptrtoint ptr [[TMP18]] to i64 +; AARCH64-SHORT-SCOPE-NEXT: [[TMP46:%.*]] = and i64 [[TMP45]], 72057594037927935 +; AARCH64-SHORT-SCOPE-NEXT: [[TMP47:%.*]] = lshr i64 [[TMP46]], 4 +; AARCH64-SHORT-SCOPE-NEXT: [[TMP48:%.*]] = getelementptr i8, ptr [[TMP17]], i64 [[TMP47]] +; AARCH64-SHORT-SCOPE-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[TMP48]], i8 [[TMP44]], i64 1, i1 false) +; AARCH64-SHORT-SCOPE-NEXT: [[TMP37:%.*]] = trunc i64 [[TMP20]] to i8 +; AARCH64-SHORT-SCOPE-NEXT: [[TMP38:%.*]] = ptrtoint ptr [[TMP18]] to i64 +; AARCH64-SHORT-SCOPE-NEXT: [[TMP39:%.*]] = and i64 [[TMP38]], 72057594037927935 +; AARCH64-SHORT-SCOPE-NEXT: [[TMP40:%.*]] = lshr i64 [[TMP39]], 4 +; AARCH64-SHORT-SCOPE-NEXT: [[TMP41:%.*]] = getelementptr i8, ptr [[TMP17]], i64 [[TMP40]] +; AARCH64-SHORT-SCOPE-NEXT: [[TMP42:%.*]] = getelementptr i8, ptr [[TMP41]], i32 0 +; AARCH64-SHORT-SCOPE-NEXT: store i8 1, ptr [[TMP42]], align 1 +; AARCH64-SHORT-SCOPE-NEXT: [[TMP43:%.*]] = getelementptr i8, ptr [[TMP18]], i32 15 +; AARCH64-SHORT-SCOPE-NEXT: store i8 [[TMP37]], ptr [[TMP43]], align 1 ; AARCH64-SHORT-SCOPE-NEXT: call void @use(ptr nonnull [[ALLOCA_0_HWASAN]]) ; AARCH64-SHORT-SCOPE-NEXT: [[TMP32:%.*]] = trunc i64 [[HWASAN_UAR_TAG]] to i8 ; AARCH64-SHORT-SCOPE-NEXT: [[TMP33:%.*]] = ptrtoint ptr [[TMP18]] to i64 @@ -755,6 +811,12 @@ define dso_local i32 @multiple_lifetimes() local_unnamed_addr sanitize_hwaddress ; AARCH64-SHORT-SCOPE-NEXT: [[TMP35:%.*]] = lshr i64 [[TMP34]], 4 ; AARCH64-SHORT-SCOPE-NEXT: [[TMP36:%.*]] = getelementptr i8, ptr [[TMP17]], i64 [[TMP35]] ; AARCH64-SHORT-SCOPE-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[TMP36]], i8 [[TMP32]], i64 1, i1 false) +; AARCH64-SHORT-SCOPE-NEXT: [[TMP49:%.*]] = trunc i64 [[HWASAN_UAR_TAG]] to i8 +; AARCH64-SHORT-SCOPE-NEXT: [[TMP50:%.*]] = ptrtoint ptr [[TMP18]] to i64 +; AARCH64-SHORT-SCOPE-NEXT: [[TMP51:%.*]] = and i64 [[TMP50]], 72057594037927935 +; AARCH64-SHORT-SCOPE-NEXT: [[TMP52:%.*]] = lshr i64 [[TMP51]], 4 +; AARCH64-SHORT-SCOPE-NEXT: [[TMP53:%.*]] = getelementptr i8, ptr [[TMP17]], i64 [[TMP52]] +; AARCH64-SHORT-SCOPE-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[TMP53]], i8 [[TMP49]], i64 1, i1 false) ; AARCH64-SHORT-SCOPE-NEXT: ret i32 0 ; ; AARCH64-SHORT-NOSCOPE-LABEL: @multiple_lifetimes( `````````` </details> https://github.com/llvm/llvm-project/pull/181438 _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
