Skip to content

Commit b264d69

Browse files
committed
[IR] Add Instruction::isLifetimeStartOrEnd, NFC
Instruction::isLifetimeStartOrEnd() checks whether an Instruction is an llvm.lifetime.start or an llvm.lifetime.end intrinsic. This was suggested as a cleanup in D55967. Differential Revision: https://reviews.llvm.org/D56019 llvm-svn: 349964
1 parent 8ed73c2 commit b264d69

18 files changed

+41
-69
lines changed

llvm/include/llvm/IR/Instruction.h

+4
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,10 @@ class Instruction : public User,
582582
}
583583
}
584584

585+
/// Return true if the instruction is a llvm.lifetime.start or
586+
/// llvm.lifetime.end marker.
587+
bool isLifetimeStartOrEnd() const;
588+
585589
/// Return a pointer to the next non-debug instruction in the same basic
586590
/// block as 'this', or nullptr if no such instruction exists.
587591
const Instruction *getNextNonDebugInstruction() const;

llvm/lib/Analysis/StackSafetyAnalysis.cpp

+2-5
Original file line numberDiff line numberDiff line change
@@ -323,11 +323,8 @@ bool StackSafetyLocalAnalysis::analyzeAllUses(const Value *Ptr, UseInfo &US) {
323323
case Instruction::Invoke: {
324324
ImmutableCallSite CS(I);
325325

326-
if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) {
327-
if (II->getIntrinsicID() == Intrinsic::lifetime_start ||
328-
II->getIntrinsicID() == Intrinsic::lifetime_end)
329-
break;
330-
}
326+
if (I->isLifetimeStartOrEnd())
327+
break;
331328

332329
if (const MemIntrinsic *MI = dyn_cast<MemIntrinsic>(I)) {
333330
US.updateRange(getMemIntrinsicAccessRange(MI, UI, Ptr));

llvm/lib/Analysis/ValueTracking.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -3822,8 +3822,7 @@ bool llvm::onlyUsedByLifetimeMarkers(const Value *V) {
38223822
const IntrinsicInst *II = dyn_cast<IntrinsicInst>(U);
38233823
if (!II) return false;
38243824

3825-
if (II->getIntrinsicID() != Intrinsic::lifetime_start &&
3826-
II->getIntrinsicID() != Intrinsic::lifetime_end)
3825+
if (!II->isLifetimeStartOrEnd())
38273826
return false;
38283827
}
38293828
return true;

llvm/lib/CodeGen/SafeStack.cpp

+2-5
Original file line numberDiff line numberDiff line change
@@ -324,11 +324,8 @@ bool SafeStack::IsSafeStackAlloca(const Value *AllocaPtr, uint64_t AllocaSize) {
324324
case Instruction::Invoke: {
325325
ImmutableCallSite CS(I);
326326

327-
if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) {
328-
if (II->getIntrinsicID() == Intrinsic::lifetime_start ||
329-
II->getIntrinsicID() == Intrinsic::lifetime_end)
330-
continue;
331-
}
327+
if (I->isLifetimeStartOrEnd())
328+
continue;
332329

333330
if (const MemIntrinsic *MI = dyn_cast<MemIntrinsic>(I)) {
334331
if (!IsMemIntrinsicSafe(MI, UI, AllocaPtr, AllocaSize)) {

llvm/lib/CodeGen/SafeStackColoring.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,10 @@ const StackColoring::LiveRange &StackColoring::getLiveRange(AllocaInst *AI) {
4646
}
4747

4848
bool StackColoring::readMarker(Instruction *I, bool *IsStart) {
49-
auto *II = dyn_cast<IntrinsicInst>(I);
50-
if (!II || (II->getIntrinsicID() != Intrinsic::lifetime_start &&
51-
II->getIntrinsicID() != Intrinsic::lifetime_end))
49+
if (!I->isLifetimeStartOrEnd())
5250
return false;
5351

52+
auto *II = cast<IntrinsicInst>(I);
5453
*IsStart = II->getIntrinsicID() == Intrinsic::lifetime_start;
5554
return true;
5655
}

llvm/lib/CodeGen/StackProtector.cpp

+1-9
Original file line numberDiff line numberDiff line change
@@ -157,14 +157,6 @@ bool StackProtector::ContainsProtectableArray(Type *Ty, bool &IsLarge,
157157
return NeedsProtector;
158158
}
159159

160-
static bool isLifetimeInst(const Instruction *I) {
161-
if (const auto Intrinsic = dyn_cast<IntrinsicInst>(I)) {
162-
const auto Id = Intrinsic->getIntrinsicID();
163-
return Id == Intrinsic::lifetime_start || Id == Intrinsic::lifetime_end;
164-
}
165-
return false;
166-
}
167-
168160
bool StackProtector::HasAddressTaken(const Instruction *AI) {
169161
for (const User *U : AI->users()) {
170162
if (const StoreInst *SI = dyn_cast<StoreInst>(U)) {
@@ -175,7 +167,7 @@ bool StackProtector::HasAddressTaken(const Instruction *AI) {
175167
return true;
176168
} else if (const CallInst *CI = dyn_cast<CallInst>(U)) {
177169
// Ignore intrinsics that are not calls. TODO: Use isLoweredToCall().
178-
if (!isa<DbgInfoIntrinsic>(CI) && !isLifetimeInst(CI))
170+
if (!isa<DbgInfoIntrinsic>(CI) && !CI->isLifetimeStartOrEnd())
179171
return true;
180172
} else if (isa<InvokeInst>(U)) {
181173
return true;

llvm/lib/IR/BasicBlock.cpp

+2-4
Original file line numberDiff line numberDiff line change
@@ -206,10 +206,8 @@ const Instruction* BasicBlock::getFirstNonPHIOrDbgOrLifetime() const {
206206
if (isa<PHINode>(I) || isa<DbgInfoIntrinsic>(I))
207207
continue;
208208

209-
if (auto *II = dyn_cast<IntrinsicInst>(&I))
210-
if (II->getIntrinsicID() == Intrinsic::lifetime_start ||
211-
II->getIntrinsicID() == Intrinsic::lifetime_end)
212-
continue;
209+
if (I.isLifetimeStartOrEnd())
210+
continue;
213211

214212
return &I;
215213
}

llvm/lib/IR/Instruction.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,14 @@ bool Instruction::isSafeToRemove() const {
598598
!this->isTerminator();
599599
}
600600

601+
bool Instruction::isLifetimeStartOrEnd() const {
602+
auto II = dyn_cast<IntrinsicInst>(this);
603+
if (!II)
604+
return false;
605+
Intrinsic::ID ID = II->getIntrinsicID();
606+
return ID == Intrinsic::lifetime_start || ID == Intrinsic::lifetime_end;
607+
}
608+
601609
const Instruction *Instruction::getNextNonDebugInstruction() const {
602610
for (const Instruction *I = getNextNode(); I; I = I->getNextNode())
603611
if (!isa<DbgInfoIntrinsic>(I))

llvm/lib/Transforms/IPO/PartialInlining.cpp

+2-6
Original file line numberDiff line numberDiff line change
@@ -851,12 +851,8 @@ int PartialInlinerImpl::computeBBInlineCost(BasicBlock *BB) {
851851
break;
852852
}
853853

854-
IntrinsicInst *IntrInst = dyn_cast<IntrinsicInst>(&I);
855-
if (IntrInst) {
856-
if (IntrInst->getIntrinsicID() == Intrinsic::lifetime_start ||
857-
IntrInst->getIntrinsicID() == Intrinsic::lifetime_end)
858-
continue;
859-
}
854+
if (I.isLifetimeStartOrEnd())
855+
continue;
860856

861857
if (CallInst *CI = dyn_cast<CallInst>(&I)) {
862858
InlineCost += getCallsiteCost(CallSite(CI), DL);

llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp

+4-7
Original file line numberDiff line numberDiff line change
@@ -116,13 +116,10 @@ isOnlyCopiedFromConstantGlobal(Value *V, MemTransferInst *&TheCopy,
116116
}
117117

118118
// Lifetime intrinsics can be handled by the caller.
119-
if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) {
120-
if (II->getIntrinsicID() == Intrinsic::lifetime_start ||
121-
II->getIntrinsicID() == Intrinsic::lifetime_end) {
122-
assert(II->use_empty() && "Lifetime markers have no result to use!");
123-
ToDelete.push_back(II);
124-
continue;
125-
}
119+
if (I->isLifetimeStartOrEnd()) {
120+
assert(I->use_empty() && "Lifetime markers have no result to use!");
121+
ToDelete.push_back(I);
122+
continue;
126123
}
127124

128125
// If this is isn't our memcpy/memmove, reject it as something we can't

llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1005,7 +1005,7 @@ struct FunctionStackPoisoner : public InstVisitor<FunctionStackPoisoner> {
10051005
if (ID == Intrinsic::localescape) LocalEscapeCall = &II;
10061006
if (!ASan.UseAfterScope)
10071007
return;
1008-
if (ID != Intrinsic::lifetime_start && ID != Intrinsic::lifetime_end)
1008+
if (!II.isLifetimeStartOrEnd())
10091009
return;
10101010
// Found lifetime intrinsic, add ASan instrumentation if necessary.
10111011
ConstantInt *Size = dyn_cast<ConstantInt>(II.getArgOperand(0));

llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -919,8 +919,7 @@ bool MemCpyOptPass::performCallSlotOptzn(Instruction *cpy, Value *cpyDest,
919919
continue;
920920
}
921921
if (const IntrinsicInst *IT = dyn_cast<IntrinsicInst>(U))
922-
if (IT->getIntrinsicID() == Intrinsic::lifetime_start ||
923-
IT->getIntrinsicID() == Intrinsic::lifetime_end)
922+
if (IT->isLifetimeStartOrEnd())
924923
continue;
925924

926925
if (U != C && U != cpy)

llvm/lib/Transforms/Scalar/SROA.cpp

+4-8
Original file line numberDiff line numberDiff line change
@@ -913,8 +913,7 @@ class AllocaSlices::SliceBuilder : public PtrUseVisitor<SliceBuilder> {
913913
if (!IsOffsetKnown)
914914
return PI.setAborted(&II);
915915

916-
if (II.getIntrinsicID() == Intrinsic::lifetime_start ||
917-
II.getIntrinsicID() == Intrinsic::lifetime_end) {
916+
if (II.isLifetimeStartOrEnd()) {
918917
ConstantInt *Length = cast<ConstantInt>(II.getArgOperand(0));
919918
uint64_t Size = std::min(AllocSize - Offset.getLimitedValue(),
920919
Length->getLimitedValue());
@@ -1807,8 +1806,7 @@ static bool isVectorPromotionViableForSlice(Partition &P, const Slice &S,
18071806
if (!S.isSplittable())
18081807
return false; // Skip any unsplittable intrinsics.
18091808
} else if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(U->getUser())) {
1810-
if (II->getIntrinsicID() != Intrinsic::lifetime_start &&
1811-
II->getIntrinsicID() != Intrinsic::lifetime_end)
1809+
if (!II->isLifetimeStartOrEnd())
18121810
return false;
18131811
} else if (U->get()->getType()->getPointerElementType()->isStructTy()) {
18141812
// Disable vector promotion when there are loads or stores of an FCA.
@@ -2029,8 +2027,7 @@ static bool isIntegerWideningViableForSlice(const Slice &S,
20292027
if (!S.isSplittable())
20302028
return false; // Skip any unsplittable intrinsics.
20312029
} else if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(U->getUser())) {
2032-
if (II->getIntrinsicID() != Intrinsic::lifetime_start &&
2033-
II->getIntrinsicID() != Intrinsic::lifetime_end)
2030+
if (!II->isLifetimeStartOrEnd())
20342031
return false;
20352032
} else {
20362033
return false;
@@ -3013,8 +3010,7 @@ class llvm::sroa::AllocaSliceRewriter
30133010
}
30143011

30153012
bool visitIntrinsicInst(IntrinsicInst &II) {
3016-
assert(II.getIntrinsicID() == Intrinsic::lifetime_start ||
3017-
II.getIntrinsicID() == Intrinsic::lifetime_end);
3013+
assert(II.isLifetimeStartOrEnd());
30183014
LLVM_DEBUG(dbgs() << " original: " << II << "\n");
30193015
assert(II.getArgOperand(1) == OldPtr);
30203016

llvm/lib/Transforms/Utils/CodeExtractor.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -332,8 +332,7 @@ bool CodeExtractor::isLegalToShrinkwrapLifetimeMarkers(
332332
default: {
333333
IntrinsicInst *IntrInst = dyn_cast<IntrinsicInst>(&II);
334334
if (IntrInst) {
335-
if (IntrInst->getIntrinsicID() == Intrinsic::lifetime_start ||
336-
IntrInst->getIntrinsicID() == Intrinsic::lifetime_end)
335+
if (IntrInst->isLifetimeStartOrEnd())
337336
break;
338337
return false;
339338
}

llvm/lib/Transforms/Utils/Evaluator.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -483,8 +483,7 @@ bool Evaluator::EvaluateBlock(BasicBlock::iterator CurInst,
483483
}
484484
}
485485

486-
if (II->getIntrinsicID() == Intrinsic::lifetime_start ||
487-
II->getIntrinsicID() == Intrinsic::lifetime_end) {
486+
if (II->isLifetimeStartOrEnd()) {
488487
LLVM_DEBUG(dbgs() << "Ignoring lifetime intrinsic.\n");
489488
++CurInst;
490489
continue;

llvm/lib/Transforms/Utils/InlineFunction.cpp

+3-9
Original file line numberDiff line numberDiff line change
@@ -1320,16 +1320,10 @@ static Value *HandleByValArgument(Value *Arg, Instruction *TheCall,
13201320

13211321
// Check whether this Value is used by a lifetime intrinsic.
13221322
static bool isUsedByLifetimeMarker(Value *V) {
1323-
for (User *U : V->users()) {
1324-
if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(U)) {
1325-
switch (II->getIntrinsicID()) {
1326-
default: break;
1327-
case Intrinsic::lifetime_start:
1328-
case Intrinsic::lifetime_end:
1323+
for (User *U : V->users())
1324+
if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(U))
1325+
if (II->isLifetimeStartOrEnd())
13291326
return true;
1330-
}
1331-
}
1332-
}
13331327
return false;
13341328
}
13351329

llvm/lib/Transforms/Utils/Local.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -393,8 +393,7 @@ bool llvm::wouldInstructionBeTriviallyDead(Instruction *I,
393393
return true;
394394

395395
// Lifetime intrinsics are dead when their right-hand is undef.
396-
if (II->getIntrinsicID() == Intrinsic::lifetime_start ||
397-
II->getIntrinsicID() == Intrinsic::lifetime_end)
396+
if (II->isLifetimeStartOrEnd())
398397
return isa<UndefValue>(II->getArgOperand(1));
399398

400399
// Assumptions are dead if their condition is trivially true. Guards on

llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,7 @@ bool llvm::isAllocaPromotable(const AllocaInst *AI) {
8282
if (SI->isVolatile())
8383
return false;
8484
} else if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(U)) {
85-
if (II->getIntrinsicID() != Intrinsic::lifetime_start &&
86-
II->getIntrinsicID() != Intrinsic::lifetime_end)
85+
if (!II->isLifetimeStartOrEnd())
8786
return false;
8887
} else if (const BitCastInst *BCI = dyn_cast<BitCastInst>(U)) {
8988
if (BCI->getType() != Type::getInt8PtrTy(U->getContext(), AS))

0 commit comments

Comments
 (0)