[llvm] [IR][NFC] Switch to use `LifetimeIntrinsic` (PR #125528)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 3 08:38:42 PST 2025
https://github.com/dtcxzyw updated https://github.com/llvm/llvm-project/pull/125528
>From 8d22edf81362347c7c322560d0fea59f81fdeb95 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Tue, 4 Feb 2025 00:18:48 +0800
Subject: [PATCH 1/2] [IR][NFC] Switch to use `LifetimeIntrinsic`
---
.../llvm/Transforms/Utils/MemoryTaggingSupport.h | 1 -
llvm/lib/Target/AArch64/AArch64StackTagging.cpp | 2 +-
llvm/lib/Transforms/Coroutines/SpillUtils.cpp | 5 ++---
.../Instrumentation/HWAddressSanitizer.cpp | 3 +--
.../Transforms/Instrumentation/TypeSanitizer.cpp | 13 ++-----------
llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp | 5 ++---
llvm/lib/Transforms/Utils/CodeExtractor.cpp | 9 +++------
llvm/lib/Transforms/Utils/InlineFunction.cpp | 5 ++---
llvm/lib/Transforms/Utils/Local.cpp | 5 +----
.../Transforms/Utils/MemoryTaggingSupport.cpp | 9 +--------
llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 16 +---------------
11 files changed, 16 insertions(+), 57 deletions(-)
diff --git a/llvm/include/llvm/Transforms/Utils/MemoryTaggingSupport.h b/llvm/include/llvm/Transforms/Utils/MemoryTaggingSupport.h
index 60255d57364099e..8b7daf616b110ab 100644
--- a/llvm/include/llvm/Transforms/Utils/MemoryTaggingSupport.h
+++ b/llvm/include/llvm/Transforms/Utils/MemoryTaggingSupport.h
@@ -91,7 +91,6 @@ class StackInfoBuilder {
uint64_t getAllocaSizeInBytes(const AllocaInst &AI);
void alignAndPadAlloca(memtag::AllocaInfo &Info, llvm::Align Align);
-bool isLifetimeIntrinsic(Value *V);
Value *readRegister(IRBuilder<> &IRB, StringRef Name);
Value *getFP(IRBuilder<> &IRB);
diff --git a/llvm/lib/Target/AArch64/AArch64StackTagging.cpp b/llvm/lib/Target/AArch64/AArch64StackTagging.cpp
index 694ee17f8e5f11e..fad83bbebd5d971 100644
--- a/llvm/lib/Target/AArch64/AArch64StackTagging.cpp
+++ b/llvm/lib/Target/AArch64/AArch64StackTagging.cpp
@@ -575,7 +575,7 @@ bool AArch64StackTagging::runOnFunction(Function &Fn) {
TagPCall->setName(Info.AI->getName() + ".tag");
// Does not replace metadata, so we don't have to handle DbgVariableRecords.
Info.AI->replaceUsesWithIf(TagPCall, [&](const Use &U) {
- return !memtag::isLifetimeIntrinsic(U.getUser());
+ return !isa<LifetimeIntrinsic>(U.getUser());
});
TagPCall->setOperand(0, Info.AI);
diff --git a/llvm/lib/Transforms/Coroutines/SpillUtils.cpp b/llvm/lib/Transforms/Coroutines/SpillUtils.cpp
index 573a2ea35deb825..5062ee97a665d6e 100644
--- a/llvm/lib/Transforms/Coroutines/SpillUtils.cpp
+++ b/llvm/lib/Transforms/Coroutines/SpillUtils.cpp
@@ -226,9 +226,8 @@ struct AllocaUseVisitor : PtrUseVisitor<AllocaUseVisitor> {
if (auto *S = dyn_cast<StoreInst>(U))
if (S->getPointerOperand() == I)
continue;
- if (auto *II = dyn_cast<IntrinsicInst>(U))
- if (II->isLifetimeStartOrEnd())
- continue;
+ if (isa<LifetimeIntrinsic>(U))
+ continue;
// BitCastInst creats aliases of the memory location being stored
// into.
if (auto *BI = dyn_cast<BitCastInst>(U)) {
diff --git a/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp
index 75a19357ea1bb90..645c1027526922f 100644
--- a/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp
@@ -1518,8 +1518,7 @@ bool HWAddressSanitizer::instrumentStack(memtag::StackInfo &SInfo,
AI->replaceUsesWithIf(Replacement, [AICast, AILong](const Use &U) {
auto *User = U.getUser();
- return User != AILong && User != AICast &&
- !memtag::isLifetimeIntrinsic(User);
+ return User != AILong && User != AICast && !isa<LifetimeIntrinsic>(User);
});
memtag::annotateDebugRecords(Info, retagMask(N));
diff --git a/llvm/lib/Transforms/Instrumentation/TypeSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/TypeSanitizer.cpp
index 94101f9663a87d6..85e762be4a22ee4 100644
--- a/llvm/lib/Transforms/Instrumentation/TypeSanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/TypeSanitizer.cpp
@@ -497,13 +497,8 @@ void collectMemAccessInfo(
if (CallInst *CI = dyn_cast<CallInst>(&Inst))
maybeMarkSanitizerLibraryCallNoBuiltin(CI, &TLI);
- if (isa<MemIntrinsic>(Inst)) {
+ if (isa<MemIntrinsic>(Inst) || isa<LifetimeIntrinsic>(Inst))
MemTypeResetInsts.push_back(&Inst);
- } else if (auto *II = dyn_cast<IntrinsicInst>(&Inst)) {
- if (II->getIntrinsicID() == Intrinsic::lifetime_start ||
- II->getIntrinsicID() == Intrinsic::lifetime_end)
- MemTypeResetInsts.push_back(&Inst);
- }
} else if (isa<AllocaInst>(Inst)) {
MemTypeResetInsts.push_back(&Inst);
}
@@ -819,11 +814,7 @@ bool TypeSanitizer::instrumentMemInst(Value *V, Instruction *ShadowBase,
NeedsMemMove = isa<MemMoveInst>(MTI);
}
}
- } else if (auto *II = dyn_cast<IntrinsicInst>(I)) {
- if (II->getIntrinsicID() != Intrinsic::lifetime_start &&
- II->getIntrinsicID() != Intrinsic::lifetime_end)
- return false;
-
+ } else if (auto *II = dyn_cast<LifetimeIntrinsic>(I)) {
Size = II->getArgOperand(0);
Dest = II->getArgOperand(1);
} else if (auto *AI = dyn_cast<AllocaInst>(I)) {
diff --git a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
index a80a85f38e74d8e..87b27beb01a0a92 100644
--- a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
+++ b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
@@ -968,9 +968,8 @@ bool MemCpyOptPass::performCallSlotOptzn(Instruction *cpyLoad,
append_range(srcUseList, U->users());
continue;
}
- if (const auto *IT = dyn_cast<IntrinsicInst>(U))
- if (IT->isLifetimeStartOrEnd())
- continue;
+ if (isa<LifetimeIntrinsic>(U))
+ continue;
if (U != C && U != cpyLoad) {
LLVM_DEBUG(dbgs() << "Call slot: Source accessed by " << *U << "\n");
diff --git a/llvm/lib/Transforms/Utils/CodeExtractor.cpp b/llvm/lib/Transforms/Utils/CodeExtractor.cpp
index 03536e6404c77cd..a79d41a3ba67afb 100644
--- a/llvm/lib/Transforms/Utils/CodeExtractor.cpp
+++ b/llvm/lib/Transforms/Utils/CodeExtractor.cpp
@@ -535,13 +535,10 @@ void CodeExtractor::findAllocas(const CodeExtractorAnalysisCache &CEAC,
Instruction *Bitcast = cast<Instruction>(U);
for (User *BU : Bitcast->users()) {
- IntrinsicInst *IntrInst = dyn_cast<IntrinsicInst>(BU);
+ IntrinsicInst *IntrInst = dyn_cast<LifetimeIntrinsic>(BU);
if (!IntrInst)
continue;
- if (!IntrInst->isLifetimeStartOrEnd())
- continue;
-
if (definedInRegion(Blocks, IntrInst))
continue;
@@ -1083,8 +1080,8 @@ static void eraseLifetimeMarkersOnInputs(const SetVector<BasicBlock *> &Blocks,
SetVector<Value *> &LifetimesStart) {
for (BasicBlock *BB : Blocks) {
for (Instruction &I : llvm::make_early_inc_range(*BB)) {
- auto *II = dyn_cast<IntrinsicInst>(&I);
- if (!II || !II->isLifetimeStartOrEnd())
+ auto *II = dyn_cast<LifetimeIntrinsic>(&I);
+ if (!II)
continue;
// Get the memory operand of the lifetime marker. If the underlying
diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp
index adc40da07d96707..b92d8b16daad2c6 100644
--- a/llvm/lib/Transforms/Utils/InlineFunction.cpp
+++ b/llvm/lib/Transforms/Utils/InlineFunction.cpp
@@ -1777,9 +1777,8 @@ static Value *HandleByValArgument(Type *ByValType, Value *Arg,
// Check whether this Value is used by a lifetime intrinsic.
static bool isUsedByLifetimeMarker(Value *V) {
for (User *U : V->users())
- if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(U))
- if (II->isLifetimeStartOrEnd())
- return true;
+ if (isa<LifetimeIntrinsic>(U))
+ return true;
return false;
}
diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp
index d5cf62e52cca399..2c6328300738f9d 100644
--- a/llvm/lib/Transforms/Utils/Local.cpp
+++ b/llvm/lib/Transforms/Utils/Local.cpp
@@ -497,10 +497,7 @@ bool llvm::wouldInstructionBeTriviallyDead(const Instruction *I,
// are lifetime intrinsics then the intrinsics are dead.
if (isa<AllocaInst>(Arg) || isa<GlobalValue>(Arg) || isa<Argument>(Arg))
return llvm::all_of(Arg->uses(), [](Use &Use) {
- if (IntrinsicInst *IntrinsicUse =
- dyn_cast<IntrinsicInst>(Use.getUser()))
- return IntrinsicUse->isLifetimeStartOrEnd();
- return false;
+ return isa<LifetimeIntrinsic>(Use.getUser());
});
return false;
}
diff --git a/llvm/lib/Transforms/Utils/MemoryTaggingSupport.cpp b/llvm/lib/Transforms/Utils/MemoryTaggingSupport.cpp
index cccb9dae17df6a7..de84a76ede7ffd5 100644
--- a/llvm/lib/Transforms/Utils/MemoryTaggingSupport.cpp
+++ b/llvm/lib/Transforms/Utils/MemoryTaggingSupport.cpp
@@ -154,9 +154,7 @@ void StackInfoBuilder::visit(OptimizationRemarkEmitter &ORE,
}
return;
}
- auto *II = dyn_cast<IntrinsicInst>(&Inst);
- if (II && (II->getIntrinsicID() == Intrinsic::lifetime_start ||
- II->getIntrinsicID() == Intrinsic::lifetime_end)) {
+ if (auto *II = dyn_cast<LifetimeIntrinsic>(&Inst)) {
AllocaInst *AI = findAllocaForValue(II->getArgOperand(1));
if (!AI) {
Info.UnrecognizedLifetimes.push_back(&Inst);
@@ -261,11 +259,6 @@ void alignAndPadAlloca(memtag::AllocaInfo &Info, llvm::Align Alignment) {
Info.AI = NewAI;
}
-bool isLifetimeIntrinsic(Value *V) {
- auto *II = dyn_cast<IntrinsicInst>(V);
- return II && II->isLifetimeStartOrEnd();
-}
-
Value *readRegister(IRBuilder<> &IRB, StringRef Name) {
Module *M = IRB.GetInsertBlock()->getParent()->getParent();
MDNode *MD =
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
index 12dd49da279b9c5..ac250baec2e2b4b 100644
--- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -2187,20 +2187,6 @@ bool SimplifyCFGOpt::hoistSuccIdenticalTerminatorToSwitchOrIf(
return Changed;
}
-// Check lifetime markers.
-static bool isLifeTimeMarker(const Instruction *I) {
- if (auto II = dyn_cast<IntrinsicInst>(I)) {
- switch (II->getIntrinsicID()) {
- default:
- break;
- case Intrinsic::lifetime_start:
- case Intrinsic::lifetime_end:
- return true;
- }
- }
- return false;
-}
-
// TODO: Refine this. This should avoid cases like turning constant memcpy sizes
// into variables.
static bool replacingOperandWithVariableIsCheap(const Instruction *I,
@@ -2321,7 +2307,7 @@ static bool canSinkInstructions(
// backend may handle such lifetimes incorrectly as well (#104776).
// Don't sink lifetimes if it would introduce a phi on the pointer
// argument.
- if (isLifeTimeMarker(I0) && OI == 1 &&
+ if (isa<LifetimeIntrinsic>(I0) && OI == 1 &&
any_of(Insts, [](const Instruction *I) {
return isa<AllocaInst>(I->getOperand(1)->stripPointerCasts());
}))
>From e21aeb4a5e8c02fc0ea291e324a96c48832d0bf0 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Tue, 4 Feb 2025 00:37:55 +0800
Subject: [PATCH 2/2] [CodeExtractor] Address review comments. NFC.
---
llvm/lib/Transforms/Utils/CodeExtractor.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/lib/Transforms/Utils/CodeExtractor.cpp b/llvm/lib/Transforms/Utils/CodeExtractor.cpp
index a79d41a3ba67afb..7277603b3ec2b0f 100644
--- a/llvm/lib/Transforms/Utils/CodeExtractor.cpp
+++ b/llvm/lib/Transforms/Utils/CodeExtractor.cpp
@@ -535,7 +535,7 @@ void CodeExtractor::findAllocas(const CodeExtractorAnalysisCache &CEAC,
Instruction *Bitcast = cast<Instruction>(U);
for (User *BU : Bitcast->users()) {
- IntrinsicInst *IntrInst = dyn_cast<LifetimeIntrinsic>(BU);
+ auto *IntrInst = dyn_cast<LifetimeIntrinsic>(BU);
if (!IntrInst)
continue;
More information about the llvm-commits
mailing list