From b256cb88a716dfd270745af1bb98b49c22521a99 Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Thu, 30 Jul 2020 18:48:34 -0700 Subject: [PATCH] [ValueTracking] Remove AllocaForValue parameter findAllocaForValue uses AllocaForValue to cache resolved values. The function is used only to resolve arguments of lifetime intrinsic which usually are not fare for allocas. So result reuse is likely unnoticeable. In followup patches I'd like to replace the function with GetUnderlyingObjects. Depends on D84616. Differential Revision: https://reviews.llvm.org/D84617 --- llvm/include/llvm/Analysis/ValueTracking.h | 6 ++++-- llvm/lib/Analysis/ValueTracking.cpp | 10 +++++++--- llvm/lib/Target/AArch64/AArch64StackTagging.cpp | 4 +--- llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp | 7 +------ llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp | 4 +--- 5 files changed, 14 insertions(+), 17 deletions(-) diff --git a/llvm/include/llvm/Analysis/ValueTracking.h b/llvm/include/llvm/Analysis/ValueTracking.h index 8008e60..92dc7c0 100644 --- a/llvm/include/llvm/Analysis/ValueTracking.h +++ b/llvm/include/llvm/Analysis/ValueTracking.h @@ -415,8 +415,10 @@ class Value; const DataLayout &DL); /// Finds alloca where the value comes from. - AllocaInst * - findAllocaForValue(Value *V, DenseMap &AllocaForValue); + AllocaInst *findAllocaForValue(Value *V); + inline const AllocaInst *findAllocaForValue(const Value *V) { + return findAllocaForValue(const_cast(V)); + } /// Return true if the only users of this pointer are lifetime markers. bool onlyUsedByLifetimeMarkers(const Value *V); diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 6fb36fa..9dfe8fd 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -4313,9 +4313,8 @@ bool llvm::getUnderlyingObjectsForCodeGen(const Value *V, return true; } -AllocaInst * -llvm::findAllocaForValue(Value *V, - DenseMap &AllocaForValue) { +static AllocaInst * +findAllocaForValue(Value *V, DenseMap &AllocaForValue) { if (AllocaInst *AI = dyn_cast(V)) return AI; // See if we've already calculated (or started to calculate) alloca for a @@ -4348,6 +4347,11 @@ llvm::findAllocaForValue(Value *V, return Res; } +AllocaInst *llvm::findAllocaForValue(Value *V) { + DenseMap AllocaForValue; + return ::findAllocaForValue(V, AllocaForValue); +} + static bool onlyUsedByLifetimeMarkersOrDroppableInstsHelper( const Value *V, bool AllowLifetime, bool AllowDroppable) { for (const User *U : V->users()) { diff --git a/llvm/lib/Target/AArch64/AArch64StackTagging.cpp b/llvm/lib/Target/AArch64/AArch64StackTagging.cpp index 0ed576f..1b8c641 100644 --- a/llvm/lib/Target/AArch64/AArch64StackTagging.cpp +++ b/llvm/lib/Target/AArch64/AArch64StackTagging.cpp @@ -544,7 +544,6 @@ bool AArch64StackTagging::runOnFunction(Function &Fn) { MapVector Allocas; // need stable iteration order SmallVector RetVec; - DenseMap AllocaForValue; SmallVector UnrecognizedLifetimes; for (auto &BB : *F) { @@ -566,8 +565,7 @@ bool AArch64StackTagging::runOnFunction(Function &Fn) { auto *II = dyn_cast(I); if (II && (II->getIntrinsicID() == Intrinsic::lifetime_start || II->getIntrinsicID() == Intrinsic::lifetime_end)) { - AllocaInst *AI = - llvm::findAllocaForValue(II->getArgOperand(1), AllocaForValue); + AllocaInst *AI = findAllocaForValue(II->getArgOperand(1)); if (!AI) { UnrecognizedLifetimes.push_back(I); continue; diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp index 647d25e..053b9aa 100644 --- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -911,10 +911,6 @@ struct FunctionStackPoisoner : public InstVisitor { AllocaInst *DynamicAllocaLayout = nullptr; IntrinsicInst *LocalEscapeCall = nullptr; - // Maps Value to an AllocaInst from which the Value is originated. - using AllocaForValueMapTy = DenseMap; - AllocaForValueMapTy AllocaForValue; - bool HasInlineAsm = false; bool HasReturnsTwiceCall = false; @@ -1065,8 +1061,7 @@ struct FunctionStackPoisoner : public InstVisitor { !ConstantInt::isValueValidForType(IntptrTy, SizeValue)) return; // Find alloca instruction that corresponds to llvm.lifetime argument. - AllocaInst *AI = - llvm::findAllocaForValue(II.getArgOperand(1), AllocaForValue); + AllocaInst *AI = findAllocaForValue(II.getArgOperand(1)); if (!AI) { HasUntracedLifetimeIntrinsic = true; return; diff --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp index f31d88a..edde80c 100644 --- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp @@ -2693,9 +2693,7 @@ struct MemorySanitizerVisitor : public InstVisitor { void handleLifetimeStart(IntrinsicInst &I) { if (!PoisonStack) return; - DenseMap AllocaForValue; - AllocaInst *AI = - llvm::findAllocaForValue(I.getArgOperand(1), AllocaForValue); + AllocaInst *AI = llvm::findAllocaForValue(I.getArgOperand(1)); if (!AI) InstrumentLifetimeStart = false; LifetimeStartList.push_back(std::make_pair(&I, AI)); -- 2.7.4