diff --git a/llvm/include/llvm/Transforms/Utils/MemoryTaggingSupport.h b/llvm/include/llvm/Transforms/Utils/MemoryTaggingSupport.h index 60255d5736409..8b7daf616b110 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 694ee17f8e5f1..fad83bbebd5d9 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(U.getUser()); }); TagPCall->setOperand(0, Info.AI); diff --git a/llvm/lib/Transforms/Coroutines/SpillUtils.cpp b/llvm/lib/Transforms/Coroutines/SpillUtils.cpp index 573a2ea35deb8..5062ee97a665d 100644 --- a/llvm/lib/Transforms/Coroutines/SpillUtils.cpp +++ b/llvm/lib/Transforms/Coroutines/SpillUtils.cpp @@ -226,9 +226,8 @@ struct AllocaUseVisitor : PtrUseVisitor { if (auto *S = dyn_cast(U)) if (S->getPointerOperand() == I) continue; - if (auto *II = dyn_cast(U)) - if (II->isLifetimeStartOrEnd()) - continue; + if (isa(U)) + continue; // BitCastInst creats aliases of the memory location being stored // into. if (auto *BI = dyn_cast(U)) { diff --git a/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp index 75a19357ea1bb..645c102752692 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(User); }); memtag::annotateDebugRecords(Info, retagMask(N)); diff --git a/llvm/lib/Transforms/Instrumentation/TypeSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/TypeSanitizer.cpp index 94101f9663a87..8c28a8e764462 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(&Inst)) maybeMarkSanitizerLibraryCallNoBuiltin(CI, &TLI); - if (isa(Inst)) { + if (isa(Inst)) MemTypeResetInsts.push_back(&Inst); - } else if (auto *II = dyn_cast(&Inst)) { - if (II->getIntrinsicID() == Intrinsic::lifetime_start || - II->getIntrinsicID() == Intrinsic::lifetime_end) - MemTypeResetInsts.push_back(&Inst); - } } else if (isa(Inst)) { MemTypeResetInsts.push_back(&Inst); } @@ -819,11 +814,7 @@ bool TypeSanitizer::instrumentMemInst(Value *V, Instruction *ShadowBase, NeedsMemMove = isa(MTI); } } - } else if (auto *II = dyn_cast(I)) { - if (II->getIntrinsicID() != Intrinsic::lifetime_start && - II->getIntrinsicID() != Intrinsic::lifetime_end) - return false; - + } else if (auto *II = dyn_cast(I)) { Size = II->getArgOperand(0); Dest = II->getArgOperand(1); } else if (auto *AI = dyn_cast(I)) { diff --git a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp index a80a85f38e74d..87b27beb01a0a 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(U)) - if (IT->isLifetimeStartOrEnd()) - continue; + if (isa(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 03536e6404c77..7277603b3ec2b 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(U); for (User *BU : Bitcast->users()) { - IntrinsicInst *IntrInst = dyn_cast(BU); + auto *IntrInst = dyn_cast(BU); if (!IntrInst) continue; - if (!IntrInst->isLifetimeStartOrEnd()) - continue; - if (definedInRegion(Blocks, IntrInst)) continue; @@ -1083,8 +1080,8 @@ static void eraseLifetimeMarkersOnInputs(const SetVector &Blocks, SetVector &LifetimesStart) { for (BasicBlock *BB : Blocks) { for (Instruction &I : llvm::make_early_inc_range(*BB)) { - auto *II = dyn_cast(&I); - if (!II || !II->isLifetimeStartOrEnd()) + auto *II = dyn_cast(&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 adc40da07d967..b92d8b16daad2 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(U)) - if (II->isLifetimeStartOrEnd()) - return true; + if (isa(U)) + return true; return false; } diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index d5cf62e52cca3..2c6328300738f 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(Arg) || isa(Arg) || isa(Arg)) return llvm::all_of(Arg->uses(), [](Use &Use) { - if (IntrinsicInst *IntrinsicUse = - dyn_cast(Use.getUser())) - return IntrinsicUse->isLifetimeStartOrEnd(); - return false; + return isa(Use.getUser()); }); return false; } diff --git a/llvm/lib/Transforms/Utils/MemoryTaggingSupport.cpp b/llvm/lib/Transforms/Utils/MemoryTaggingSupport.cpp index cccb9dae17df6..de84a76ede7ff 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(&Inst); - if (II && (II->getIntrinsicID() == Intrinsic::lifetime_start || - II->getIntrinsicID() == Intrinsic::lifetime_end)) { + if (auto *II = dyn_cast(&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(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 12dd49da279b9..ac250baec2e2b 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(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(I0) && OI == 1 && any_of(Insts, [](const Instruction *I) { return isa(I->getOperand(1)->stripPointerCasts()); }))