[llvm-branch-commits] [llvm] [NFC] [HWASan] Add test for double lifetime (PR #182424)
Florian Mayer via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Feb 19 19:58:03 PST 2026
https://github.com/fmayer updated https://github.com/llvm/llvm-project/pull/182424
>From 9f2a4b4ed2409b02cf9ff0b79aea5eecd2de8900 Mon Sep 17 00:00:00 2001
From: Florian Mayer <fmayer at google.com>
Date: Thu, 19 Feb 2026 19:19:06 -0800
Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20change?=
=?UTF-8?q?s=20to=20main=20this=20commit=20is=20based=20on?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Created using spr 1.3.7
[skip ci]
---
.../Instrumentation/HWAddressSanitizer.cpp | 39 ++++++++----
.../RISCV/use-after-scope-setjmp.ll | 24 +++++--
.../use-after-scope-setjmp.ll | 24 +++++--
.../HWAddressSanitizer/use-after-scope.ll | 62 +++++++++++++++++++
4 files changed, 125 insertions(+), 24 deletions(-)
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(
More information about the llvm-branch-commits
mailing list