From 0b743ecaee9c9dbd61846c2617f069cf09488190 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 22 Jul 2025 12:36:47 +0200 Subject: [PATCH] [Sanitizers] Remove handling for lifetimes on non-alloca insts (NFC) After #149310 the pointer argument of lifetime.start/lifetime.end is guaranteed to be an alloca, so we don't need to go through findAllocaForValue() anymore, and don't have to have special handling for the case where it fails. --- .../Transforms/Utils/MemoryTaggingSupport.h | 1 - llvm/lib/Analysis/StackLifetime.cpp | 5 +---- llvm/lib/Target/AArch64/AArch64StackTagging.cpp | 6 ------ .../Instrumentation/AddressSanitizer.cpp | 17 +---------------- .../Instrumentation/HWAddressSanitizer.cpp | 3 --- .../Instrumentation/MemorySanitizer.cpp | 7 ++----- .../Scalar/TailRecursionElimination.cpp | 3 +-- .../Transforms/Utils/MemoryTaggingSupport.cpp | 6 +----- 8 files changed, 6 insertions(+), 42 deletions(-) diff --git a/llvm/include/llvm/Transforms/Utils/MemoryTaggingSupport.h b/llvm/include/llvm/Transforms/Utils/MemoryTaggingSupport.h index f288bdfb84f49..e0cdcf84012e8 100644 --- a/llvm/include/llvm/Transforms/Utils/MemoryTaggingSupport.h +++ b/llvm/include/llvm/Transforms/Utils/MemoryTaggingSupport.h @@ -57,7 +57,6 @@ struct AllocaInfo { struct StackInfo { MapVector AllocasToInstrument; - SmallVector UnrecognizedLifetimes; SmallVector RetVec; bool CallsReturnTwice = false; }; diff --git a/llvm/lib/Analysis/StackLifetime.cpp b/llvm/lib/Analysis/StackLifetime.cpp index 21f54c7cbc849..34a7a0416d290 100644 --- a/llvm/lib/Analysis/StackLifetime.cpp +++ b/llvm/lib/Analysis/StackLifetime.cpp @@ -63,10 +63,7 @@ bool StackLifetime::isAliveAfter(const AllocaInst *AI, // markers has the same size and points to the alloca start. static const AllocaInst *findMatchingAlloca(const IntrinsicInst &II, const DataLayout &DL) { - const AllocaInst *AI = findAllocaForValue(II.getArgOperand(1), true); - if (!AI) - return nullptr; - + const AllocaInst *AI = cast(II.getArgOperand(1)); auto AllocaSize = AI->getAllocationSize(DL); if (!AllocaSize) return nullptr; diff --git a/llvm/lib/Target/AArch64/AArch64StackTagging.cpp b/llvm/lib/Target/AArch64/AArch64StackTagging.cpp index 75c7dd944b467..f136a18421524 100644 --- a/llvm/lib/Target/AArch64/AArch64StackTagging.cpp +++ b/llvm/lib/Target/AArch64/AArch64StackTagging.cpp @@ -581,7 +581,6 @@ bool AArch64StackTagging::runOnFunction(Function &Fn) { // statement if return_twice functions are called. bool StandardLifetime = !SInfo.CallsReturnTwice && - SInfo.UnrecognizedLifetimes.empty() && memtag::isStandardLifetime(Info.LifetimeStart, Info.LifetimeEnd, DT, LI, ClMaxLifetimes); if (StandardLifetime) { @@ -616,10 +615,5 @@ bool AArch64StackTagging::runOnFunction(Function &Fn) { memtag::annotateDebugRecords(Info, Tag); } - // If we have instrumented at least one alloca, all unrecognized lifetime - // intrinsics have to go. - for (auto *I : SInfo.UnrecognizedLifetimes) - I->eraseFromParent(); - return true; } diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp index fbaa651641566..e87bee79a6a69 100644 --- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -1063,7 +1063,6 @@ struct FunctionStackPoisoner : public InstVisitor { }; SmallVector DynamicAllocaPoisonCallVec; SmallVector StaticAllocaPoisonCallVec; - bool HasUntracedLifetimeIntrinsic = false; SmallVector DynamicAllocaVec; SmallVector StackRestoreVec; @@ -1097,14 +1096,6 @@ struct FunctionStackPoisoner : public InstVisitor { initializeCallbacks(*F.getParent()); - if (HasUntracedLifetimeIntrinsic) { - // If there are lifetime intrinsics which couldn't be traced back to an - // alloca, we may not know exactly when a variable enters scope, and - // therefore should "fail safe" by not poisoning them. - StaticAllocaPoisonCallVec.clear(); - DynamicAllocaPoisonCallVec.clear(); - } - processDynamicAllocas(); processStaticAllocas(); @@ -1231,13 +1222,7 @@ struct FunctionStackPoisoner : public InstVisitor { !ConstantInt::isValueValidForType(IntptrTy, SizeValue)) return; // Find alloca instruction that corresponds to llvm.lifetime argument. - // Currently we can only handle lifetime markers pointing to the - // beginning of the alloca. - AllocaInst *AI = findAllocaForValue(II.getArgOperand(1), true); - if (!AI) { - HasUntracedLifetimeIntrinsic = true; - return; - } + AllocaInst *AI = cast(II.getArgOperand(1)); // We're interested only in allocas we can handle. if (!ASan.isInterestingAlloca(*AI)) return; diff --git a/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp index 2c34bf2157cdd..5849c3e475a6a 100644 --- a/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp @@ -1500,7 +1500,6 @@ bool HWAddressSanitizer::instrumentStack(memtag::StackInfo &SInfo, // statement if return_twice functions are called. bool StandardLifetime = !SInfo.CallsReturnTwice && - SInfo.UnrecognizedLifetimes.empty() && memtag::isStandardLifetime(Info.LifetimeStart, Info.LifetimeEnd, &DT, &LI, ClMaxLifetimes); if (DetectUseAfterScope && StandardLifetime) { @@ -1525,8 +1524,6 @@ bool HWAddressSanitizer::instrumentStack(memtag::StackInfo &SInfo, } memtag::alignAndPadAlloca(Info, Mapping.getObjectAlignment()); } - for (auto &I : SInfo.UnrecognizedLifetimes) - I->eraseFromParent(); return true; } diff --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp index 7b5831652aa6e..599b60dfba988 100644 --- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp @@ -1216,7 +1216,6 @@ struct MemorySanitizerVisitor : public InstVisitor { }; SmallVector InstrumentationList; DenseMap LazyWarningDebugLocationCount; - bool InstrumentLifetimeStart = ClHandleLifetimeIntrinsics; SmallSetVector AllocaSet; SmallVector, 16> LifetimeStartList; SmallVector StoreList; @@ -1623,7 +1622,7 @@ struct MemorySanitizerVisitor : public InstVisitor { // Poison llvm.lifetime.start intrinsics, if we haven't fallen back to // instrumenting only allocas. - if (InstrumentLifetimeStart) { + if (ClHandleLifetimeIntrinsics) { for (auto Item : LifetimeStartList) { instrumentAlloca(*Item.second, Item.first); AllocaSet.remove(Item.second); @@ -3303,9 +3302,7 @@ struct MemorySanitizerVisitor : public InstVisitor { void handleLifetimeStart(IntrinsicInst &I) { if (!PoisonStack) return; - AllocaInst *AI = llvm::findAllocaForValue(I.getArgOperand(1)); - if (!AI) - InstrumentLifetimeStart = false; + AllocaInst *AI = cast(I.getArgOperand(1)); LifetimeStartList.push_back(std::make_pair(&I, AI)); } diff --git a/llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp b/llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp index 7828571123bca..1d83ddc6b5a96 100644 --- a/llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp +++ b/llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp @@ -343,8 +343,7 @@ static bool markTails(Function &F, OptimizationRemarkEmitter *ORE) { /// static bool canMoveAboveCall(Instruction *I, CallInst *CI, AliasAnalysis *AA) { if (const IntrinsicInst *II = dyn_cast(I)) - if (II->getIntrinsicID() == Intrinsic::lifetime_end && - llvm::findAllocaForValue(II->getArgOperand(1))) + if (II->getIntrinsicID() == Intrinsic::lifetime_end) return true; // FIXME: We can move load/store/call/free instructions above the call if the diff --git a/llvm/lib/Transforms/Utils/MemoryTaggingSupport.cpp b/llvm/lib/Transforms/Utils/MemoryTaggingSupport.cpp index 40dc02c546dfa..bea76d39bb216 100644 --- a/llvm/lib/Transforms/Utils/MemoryTaggingSupport.cpp +++ b/llvm/lib/Transforms/Utils/MemoryTaggingSupport.cpp @@ -155,11 +155,7 @@ void StackInfoBuilder::visit(OptimizationRemarkEmitter &ORE, return; } if (auto *II = dyn_cast(&Inst)) { - AllocaInst *AI = findAllocaForValue(II->getArgOperand(1)); - if (!AI) { - Info.UnrecognizedLifetimes.push_back(&Inst); - return; - } + AllocaInst *AI = cast(II->getArgOperand(1)); if (getAllocaInterestingness(*AI) != AllocaInterestingness::kInteresting) return; if (II->getIntrinsicID() == Intrinsic::lifetime_start)