59#include "llvm/IR/IntrinsicsWebAssembly.h"
93#define DEBUG_TYPE "local"
95STATISTIC(NumRemoved,
"Number of unreachable basic blocks removed");
96STATISTIC(NumPHICSEs,
"Number of PHI's that got CSE'd");
100#ifdef EXPENSIVE_CHECKS
106 cl::desc(
"Perform extra assertion checking to verify that PHINodes's hash "
107 "function is well-behaved w.r.t. its isEqual predicate"));
112 "When the basic block contains not more than this number of PHI nodes, "
113 "perform a (faster!) exhaustive search instead of set-driven one."));
116 "max-phi-entries-increase-after-removing-empty-block",
cl::init(1000),
118 cl::desc(
"Stop removing an empty block if removing it will introduce more "
119 "than this number of phi entries in its successor"));
143 if (
auto *BI = dyn_cast<BranchInst>(
T)) {
144 if (BI->isUnconditional())
return false;
149 if (Dest2 == Dest1) {
155 assert(BI->getParent() &&
"Terminator not inserted in block!");
162 NewBI->
copyMetadata(*BI, {LLVMContext::MD_loop, LLVMContext::MD_dbg,
163 LLVMContext::MD_annotation});
166 BI->eraseFromParent();
167 if (DeleteDeadConditions)
172 if (
auto *
Cond = dyn_cast<ConstantInt>(BI->getCondition())) {
186 NewBI->
copyMetadata(*BI, {LLVMContext::MD_loop, LLVMContext::MD_dbg,
187 LLVMContext::MD_annotation});
189 BI->eraseFromParent();
191 DTU->
applyUpdates({{DominatorTree::Delete, BB, OldDest}});
198 if (
auto *SI = dyn_cast<SwitchInst>(
T)) {
201 auto *CI = dyn_cast<ConstantInt>(SI->getCondition());
202 BasicBlock *DefaultDest = SI->getDefaultDest();
207 SI->getNumCases() > 0) {
208 TheOnlyDest = SI->case_begin()->getCaseSuccessor();
211 bool Changed =
false;
214 for (
auto It = SI->case_begin(),
End = SI->case_end(); It !=
End;) {
216 if (It->getCaseValue() == CI) {
217 TheOnlyDest = It->getCaseSuccessor();
223 if (It->getCaseSuccessor() == DefaultDest) {
225 unsigned NCases = SI->getNumCases();
228 if (NCases > 1 && MD) {
234 unsigned Idx = It->getCaseIndex();
236 Weights[0] += Weights[
Idx + 1];
245 It = SI->removeCase(It);
246 End = SI->case_end();
250 if (
auto *NewCI = dyn_cast<ConstantInt>(SI->getCondition())) {
252 It = SI->case_begin();
262 if (It->getCaseSuccessor() != TheOnlyDest)
263 TheOnlyDest =
nullptr;
269 if (CI && !TheOnlyDest) {
272 TheOnlyDest = SI->getDefaultDest();
287 if (DTU && Succ != TheOnlyDest)
288 RemovedSuccessors.
insert(Succ);
290 if (Succ == SuccToKeep) {
291 SuccToKeep =
nullptr;
299 SI->eraseFromParent();
300 if (DeleteDeadConditions)
303 std::vector<DominatorTree::UpdateType> Updates;
304 Updates.reserve(RemovedSuccessors.
size());
305 for (
auto *RemovedSuccessor : RemovedSuccessors)
306 Updates.push_back({DominatorTree::Delete, BB, RemovedSuccessor});
312 if (SI->getNumCases() == 1) {
315 auto FirstCase = *SI->case_begin();
317 FirstCase.getCaseValue(),
"cond");
321 FirstCase.getCaseSuccessor(),
322 SI->getDefaultDest());
334 MDNode *MakeImplicitMD = SI->getMetadata(LLVMContext::MD_make_implicit);
336 NewBr->
setMetadata(LLVMContext::MD_make_implicit, MakeImplicitMD);
339 SI->eraseFromParent();
345 if (
auto *IBI = dyn_cast<IndirectBrInst>(
T)) {
348 dyn_cast<BlockAddress>(IBI->getAddress()->stripPointerCasts())) {
349 BasicBlock *TheOnlyDest = BA->getBasicBlock();
356 for (
unsigned i = 0, e = IBI->getNumDestinations(); i != e; ++i) {
358 if (DTU && DestBB != TheOnlyDest)
359 RemovedSuccessors.
insert(DestBB);
360 if (IBI->getDestination(i) == SuccToKeep) {
361 SuccToKeep =
nullptr;
367 IBI->eraseFromParent();
368 if (DeleteDeadConditions)
375 BA->destroyConstant();
386 std::vector<DominatorTree::UpdateType> Updates;
387 Updates.reserve(RemovedSuccessors.
size());
388 for (
auto *RemovedSuccessor : RemovedSuccessors)
389 Updates.push_back({DominatorTree::Delete, BB, RemovedSuccessor});
418 if (
II->getIntrinsicID() == Intrinsic::stacksave ||
419 II->getIntrinsicID() == Intrinsic::launder_invariant_group ||
420 II->isLifetimeStartOrEnd())
427 if (
I->isTerminator())
436 if (isa<DbgVariableIntrinsic>(
I))
445 if (
auto *CB = dyn_cast<CallBase>(
I))
449 if (!
I->willReturn()) {
450 auto *
II = dyn_cast<IntrinsicInst>(
I);
454 switch (
II->getIntrinsicID()) {
455 case Intrinsic::experimental_guard: {
459 auto *
Cond = dyn_cast<ConstantInt>(
II->getArgOperand(0));
464 case Intrinsic::wasm_trunc_signed:
465 case Intrinsic::wasm_trunc_unsigned:
466 case Intrinsic::ptrauth_auth:
467 case Intrinsic::ptrauth_resign:
474 if (!
I->mayHaveSideEffects())
481 if (
II->getIntrinsicID() == Intrinsic::stacksave ||
482 II->getIntrinsicID() == Intrinsic::launder_invariant_group)
487 if (
II->getIntrinsicID() == Intrinsic::allow_runtime_check ||
488 II->getIntrinsicID() == Intrinsic::allow_ubsan_check)
491 if (
II->isLifetimeStartOrEnd()) {
492 auto *Arg =
II->getArgOperand(1);
494 if (isa<UndefValue>(Arg))
498 if (isa<AllocaInst>(Arg) || isa<GlobalValue>(Arg) || isa<Argument>(Arg))
500 if (IntrinsicInst *IntrinsicUse =
501 dyn_cast<IntrinsicInst>(Use.getUser()))
502 return IntrinsicUse->isLifetimeStartOrEnd();
509 if (
II->getIntrinsicID() == Intrinsic::assume &&
512 return !
Cond->isZero();
517 if (
auto *FPI = dyn_cast<ConstrainedFPIntrinsic>(
I)) {
518 std::optional<fp::ExceptionBehavior> ExBehavior =
519 FPI->getExceptionBehavior();
524 if (
auto *Call = dyn_cast<CallBase>(
I)) {
526 if (
Constant *
C = dyn_cast<Constant>(FreedOp))
527 return C->isNullValue() || isa<UndefValue>(
C);
533 if (
auto *LI = dyn_cast<LoadInst>(
I))
534 if (
auto *GV = dyn_cast<GlobalVariable>(
535 LI->getPointerOperand()->stripPointerCasts()))
536 if (!LI->isVolatile() && GV->isConstant())
548 std::function<
void(
Value *)> AboutToDeleteCallback) {
556 AboutToDeleteCallback);
564 std::function<
void(
Value *)> AboutToDeleteCallback) {
565 unsigned S = 0, E = DeadInsts.
size(), Alive = 0;
566 for (; S != E; ++S) {
567 auto *
I = dyn_cast_or_null<Instruction>(DeadInsts[S]);
569 DeadInsts[S] =
nullptr;
576 AboutToDeleteCallback);
583 std::function<
void(
Value *)> AboutToDeleteCallback) {
585 while (!DeadInsts.
empty()) {
591 "Live instruction found in dead worklist!");
592 assert(
I->use_empty() &&
"Instructions with uses are not dead.");
597 if (AboutToDeleteCallback)
598 AboutToDeleteCallback(
I);
602 for (
Use &OpU :
I->operands()) {
603 Value *OpV = OpU.get();
619 I->eraseFromParent();
627 for (
auto *DII : DbgUsers)
628 DII->setKillLocation();
629 for (
auto *DVR : DPUsers)
630 DVR->setKillLocation();
645 for (++UI; UI != UE; ++UI) {
662 I = cast<Instruction>(*
I->user_begin())) {
668 if (!Visited.
insert(
I).second) {
688 for (
unsigned i = 0, e =
I->getNumOperands(); i != e; ++i) {
689 Value *OpV =
I->getOperand(i);
690 I->setOperand(i,
nullptr);
703 I->eraseFromParent();
711 for (
User *U :
I->users()) {
713 WorkList.
insert(cast<Instruction>(U));
718 bool Changed =
false;
719 if (!
I->use_empty()) {
720 I->replaceAllUsesWith(SimpleV);
724 I->eraseFromParent();
739 bool MadeChange =
false;
756 assert(!BI->isTerminator());
766 while (!WorkList.
empty()) {
781 while (
PHINode *PN = dyn_cast<PHINode>(DestBB->
begin())) {
782 Value *NewVal = PN->getIncomingValue(0);
785 PN->replaceAllUsesWith(NewVal);
786 PN->eraseFromParent();
790 assert(PredBB &&
"Block doesn't have a single predecessor!");
804 if (PredOfPredBB != PredBB)
805 if (SeenPreds.
insert(PredOfPredBB).second)
806 Updates.
push_back({DominatorTree::Insert, PredOfPredBB, DestBB});
809 if (SeenPreds.
insert(PredOfPredBB).second)
810 Updates.
push_back({DominatorTree::Delete, PredOfPredBB, PredBB});
811 Updates.
push_back({DominatorTree::Delete, PredBB, DestBB});
841 "The successor list of PredBB isn't empty before "
842 "applying corresponding DTU updates.");
863 return First == Second || isa<UndefValue>(
First) || isa<UndefValue>(Second);
894 if (BBPreds.
count(IBB) &&
898 <<
"Can't fold, phi node " << PN->
getName() <<
" in "
899 << Succ->
getName() <<
" is conflicting with "
900 << BBPN->
getName() <<
" with regard to common predecessor "
912 if (BBPreds.
count(IBB) &&
916 <<
" is conflicting with regard to common "
917 <<
"predecessor " << IBB->
getName() <<
"\n");
944 if (!isa<UndefValue>(OldVal)) {
946 IncomingValues.
find(BB)->second == OldVal) &&
947 "Expected OldVal to match incoming value from BB!");
949 IncomingValues.
insert(std::make_pair(BB, OldVal));
954 if (It != IncomingValues.
end())
return It->second;
973 if (!isa<UndefValue>(V))
974 IncomingValues.
insert(std::make_pair(BB, V));
989 if (!isa<UndefValue>(V))
continue;
998 if (It == IncomingValues.
end()) {
1011 unsigned PoisonCount =
count_if(TrueUndefOps, [&](
unsigned i) {
1014 if (PoisonCount != 0 && PoisonCount != TrueUndefOps.
size()) {
1015 for (
unsigned i : TrueUndefOps)
1029 if (BB->
phis().empty() || Succ->
phis().empty())
1044 if (BBPreds.
count(SuccPred)) {
1047 CommonPred = SuccPred;
1063 unsigned NumChangedPhi = 0;
1064 for (
auto &Phi : Succ->
phis()) {
1067 if (
auto *IncomingPhi = dyn_cast<PHINode>(Phi.getIncomingValueForBlock(BB)))
1068 if (IncomingPhi->getParent() == BB)
1077 return (NumPreds - 1) * NumChangedPhi >
1094 assert(OldVal &&
"No entry in PHI for Pred BB!");
1111 if (isa<PHINode>(OldVal) && cast<PHINode>(OldVal)->
getParent() == BB) {
1112 PHINode *OldValPN = cast<PHINode>(OldVal);
1121 if (PredBB == CommonPred)
1139 if (PredBB == CommonPred)
1159 "TryToSimplifyUncondBranchFromEmptyBlock called on entry block!");
1176 BB, Succ, BBPreds, CommonPred);
1198 while (isa<PHINode>(*BBI)) {
1199 for (
Use &U : BBI->uses()) {
1200 if (
PHINode* PN = dyn_cast<PHINode>(U.getUser())) {
1201 if (PN->getIncomingBlock(U) != BB)
1211 if (BBPhisMergeable && CommonPred)
1213 <<
" and " << Succ->
getName() <<
" : "
1214 << CommonPred->
getName() <<
"\n");
1282 if (TI->hasNonDebugLocLoopMetadata())
1285 if (PredTI->hasNonDebugLocLoopMetadata())
1290 else if (BBPhisMergeable)
1305 if (SeenPreds.
insert(PredOfBB).second)
1306 Updates.
push_back({DominatorTree::Insert, PredOfBB, Succ});
1314 if (SeenPreds.
insert(PredOfBB).second && PredOfBB != CommonPred)
1315 Updates.
push_back({DominatorTree::Delete, PredOfBB, BB});
1318 Updates.
push_back({DominatorTree::Delete, BB, Succ});
1321 if (isa<PHINode>(Succ->
begin())) {
1341 while (
PHINode *PN = dyn_cast<PHINode>(&BB->
front())) {
1343 assert(PN->use_empty() &&
"There shouldn't be any uses here!");
1344 PN->eraseFromParent();
1352 if (TI->hasNonDebugLocLoopMetadata()) {
1353 MDNode *LoopMD = TI->getMetadata(LLVMContext::MD_loop);
1355 Pred->getTerminator()->setMetadata(LLVMContext::MD_loop, LoopMD);
1371 "applying corresponding DTU updates.");
1372 }
else if (BBPhisMergeable) {
1375 if (
Instruction *UseInst = dyn_cast<Instruction>(U.getUser()))
1376 return UseInst->
getParent() != CommonPred &&
1377 BBPreds.
contains(UseInst->getParent());
1398 bool Changed =
false;
1403 for (
auto I = BB->
begin();
PHINode *PN = dyn_cast<PHINode>(
I);) {
1408 for (
auto J =
I;
PHINode *DuplicatePN = dyn_cast<PHINode>(J); ++J) {
1409 if (
ToRemove.contains(DuplicatePN))
1434 struct PHIDenseMapInfo {
1435 static PHINode *getEmptyKey() {
1439 static PHINode *getTombstoneKey() {
1444 return PN == getEmptyKey() || PN == getTombstoneKey();
1458 static unsigned getHashValue(
PHINode *PN) {
1473 return LHS->isIdenticalTo(
RHS);
1491 bool Changed =
false;
1492 for (
auto I = BB->
begin();
PHINode *PN = dyn_cast<PHINode>(
I++);) {
1495 auto Inserted = PHISet.
insert(PN);
1496 if (!Inserted.second) {
1499 PN->replaceAllUsesWith(*Inserted.first);
1528 PN->eraseFromParent();
1534 V = V->stripPointerCasts();
1536 if (
AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
1542 Align CurrentAlign = AI->getAlign();
1543 if (PrefAlign <= CurrentAlign)
1544 return CurrentAlign;
1549 if (StackAlign && PrefAlign > *StackAlign)
1550 return CurrentAlign;
1551 AI->setAlignment(PrefAlign);
1555 if (
auto *GO = dyn_cast<GlobalObject>(V)) {
1557 Align CurrentAlign = GO->getPointerAlignment(
DL);
1558 if (PrefAlign <= CurrentAlign)
1559 return CurrentAlign;
1565 if (!GO->canIncreaseAlignment())
1566 return CurrentAlign;
1568 if (GO->isThreadLocal()) {
1569 unsigned MaxTLSAlign = GO->getParent()->getMaxTLSAlignment() / CHAR_BIT;
1570 if (MaxTLSAlign && PrefAlign >
Align(MaxTLSAlign))
1571 PrefAlign =
Align(MaxTLSAlign);
1574 GO->setAlignment(PrefAlign);
1586 assert(V->getType()->isPointerTy() &&
1587 "getOrEnforceKnownAlignment expects a pointer!");
1599 if (PrefAlign && *PrefAlign > Alignment)
1620 for (
auto *DVI : DbgValues) {
1622 if ((DVI->getVariable() == DIVar) && (DVI->getExpression() == DIExpr))
1625 for (
auto *DVR : DbgVariableRecords) {
1627 if ((DVR->getVariable() == DIVar) && (DVR->getExpression() == DIExpr))
1643 TypeSize ValueSize =
DL.getTypeAllocSizeInBits(ValTy);
1644 if (std::optional<uint64_t> FragmentSize =
1654 "address of variable must have exactly 1 location operand.");
1657 if (std::optional<TypeSize> FragmentSize =
1658 AI->getAllocationSizeInBits(
DL)) {
1659 return TypeSize::isKnownGE(ValueSize, *FragmentSize);
1670 TypeSize ValueSize =
DL.getTypeAllocSizeInBits(ValTy);
1671 if (std::optional<uint64_t> FragmentSize =
1681 "address of variable must have exactly 1 location operand.");
1684 if (std::optional<TypeSize> FragmentSize = AI->getAllocationSizeInBits(
DL)) {
1685 return TypeSize::isKnownGE(ValueSize, *FragmentSize);
1699 auto DbgVal = Builder.insertDbgValueIntrinsic(DV, DIVar, DIExpr, NewLoc,
1701 cast<Instruction *>(DbgVal)->insertBefore(Instr);
1708 Instr->getParent()->insertDbgRecordBefore(DV, Instr);
1716 auto DbgVal = Builder.insertDbgValueIntrinsic(DV, DIVar, DIExpr, NewLoc,
1718 cast<Instruction *>(DbgVal)->insertAfter(&*Instr);
1725 Instr->getParent()->insertDbgRecordAfter(DV, &*Instr);
1735 assert(DIVar &&
"Missing variable");
1737 Value *DV = SI->getValueOperand();
1754 DIExpr->isDeref() || (!DIExpr->startsWithDeref() &&
1764 LLVM_DEBUG(
dbgs() <<
"Failed to convert dbg.declare to dbg.value: " << *DII
1776 return DIExpression::get(DIExpr->
getContext(),
1783 assert(DIVar &&
"Missing variable");
1786 Value *DV = SI->getValueOperand();
1800 assert(DIVar &&
"Missing variable");
1806 LLVM_DEBUG(
dbgs() <<
"Failed to convert dbg.declare to dbg.value: "
1825 assert(DIVar &&
"Missing variable");
1827 Value *DV = SI->getValueOperand();
1844 DIExpr->isDeref() || (!DIExpr->startsWithDeref() &&
1854 LLVM_DEBUG(
dbgs() <<
"Failed to convert dbg.declare to dbg.value: " << *DVR
1865 SI->getParent()->insertDbgRecordBefore(NewDVR, SI->getIterator());
1871 assert(DIVar &&
"Missing variable");
1874 Value *DV = SI->getValueOperand();
1888 assert(DIVar &&
"Missing variable");
1897 LLVM_DEBUG(
dbgs() <<
"Failed to convert dbg.declare to dbg.value: "
1910 if (InsertionPt != BB->
end()) {
1920 assert(DIVar &&
"Missing variable");
1926 LLVM_DEBUG(
dbgs() <<
"Failed to convert dbg.declare to DbgVariableRecord: "
1943 LI->
getParent()->insertDbgRecordAfter(DV, LI);
1960 assert(DIVar &&
"Missing variable");
1969 LLVM_DEBUG(
dbgs() <<
"Failed to convert dbg.declare to DbgVariableRecord: "
1982 if (InsertionPt != BB->
end()) {
1991 bool Changed =
false;
1995 for (
auto &FI :
F) {
1997 if (
auto *DDI = dyn_cast<DbgDeclareInst>(&BI))
2000 if (DVR.getType() == DbgVariableRecord::LocationType::Declare)
2009 auto LowerOne = [&](
auto *DDI) {
2011 dyn_cast_or_null<AllocaInst>(DDI->getVariableLocationOp(0));
2023 if (LoadInst *LI = dyn_cast<LoadInst>(U))
2024 return LI->isVolatile();
2025 if (StoreInst *SI = dyn_cast<StoreInst>(U))
2026 return SI->isVolatile();
2033 while (!WorkList.
empty()) {
2035 for (
const auto &AIUse : V->uses()) {
2036 User *U = AIUse.getUser();
2037 if (
StoreInst *SI = dyn_cast<StoreInst>(U)) {
2038 if (AIUse.getOperandNo() == 1)
2040 }
else if (
LoadInst *LI = dyn_cast<LoadInst>(U)) {
2042 }
else if (
CallInst *CI = dyn_cast<CallInst>(U)) {
2046 if (!CI->isLifetimeStartOrEnd()) {
2054 }
else if (
BitCastInst *BI = dyn_cast<BitCastInst>(U)) {
2055 if (BI->getType()->isPointerTy())
2060 DDI->eraseFromParent();
2080 assert(BB &&
"No BasicBlock to clone DbgVariableRecord(s) from.");
2081 if (InsertedPHIs.
size() == 0)
2086 for (
auto &
I : *BB) {
2088 for (
Value *V : DVR.location_ops())
2089 if (
auto *Loc = dyn_cast_or_null<PHINode>(V))
2090 DbgValueMap.
insert({Loc, &DVR});
2093 if (DbgValueMap.
size() == 0)
2108 for (
auto PHI : InsertedPHIs) {
2113 for (
auto VI :
PHI->operand_values()) {
2114 auto V = DbgValueMap.
find(VI);
2115 if (V != DbgValueMap.
end()) {
2117 auto NewDI = NewDbgValueMap.
find({Parent, DbgII});
2118 if (NewDI == NewDbgValueMap.
end()) {
2120 NewDI = NewDbgValueMap.
insert({{Parent, DbgII}, NewDbgII}).first;
2131 for (
auto DI : NewDbgValueMap) {
2135 assert(InsertionPt != Parent->
end() &&
"Ill-formed basic block");
2144 assert(BB &&
"No BasicBlock to clone dbg.value(s) from.");
2145 if (InsertedPHIs.
size() == 0)
2152 for (
auto &
I : *BB) {
2153 if (
auto DbgII = dyn_cast<DbgVariableIntrinsic>(&
I)) {
2154 for (
Value *V : DbgII->location_ops())
2155 if (
auto *Loc = dyn_cast_or_null<PHINode>(V))
2156 DbgValueMap.
insert({Loc, DbgII});
2159 if (DbgValueMap.
size() == 0)
2174 for (
auto *
PHI : InsertedPHIs) {
2179 for (
auto *VI :
PHI->operand_values()) {
2180 auto V = DbgValueMap.
find(VI);
2181 if (V != DbgValueMap.
end()) {
2182 auto *DbgII = cast<DbgVariableIntrinsic>(V->second);
2183 auto [NewDI, Inserted] = NewDbgValueMap.
try_emplace({Parent, DbgII});
2185 NewDI->second = cast<DbgVariableIntrinsic>(DbgII->clone());
2195 for (
auto DI : NewDbgValueMap) {
2197 auto *NewDbgII = DI.second;
2199 assert(InsertionPt != Parent->
end() &&
"Ill-formed basic block");
2200 NewDbgII->insertBefore(&*InsertionPt);
2210 auto ReplaceOne = [&](
auto *DII) {
2211 assert(DII->getVariable() &&
"Missing variable");
2212 auto *DIExpr = DII->getExpression();
2214 DII->setExpression(DIExpr);
2215 DII->replaceVariableLocationOp(
Address, NewAddress);
2221 return !DbgDeclares.
empty() || !DVRDeclares.
empty();
2230 assert(DIVar &&
"Missing variable");
2260 for (
auto *DVI : DbgUsers)
2262 DVI->getExpression(), NewAllocaAddress, DVI,
2263 nullptr, Builder,
Offset);
2268 DVR->getExpression(), NewAllocaAddress,
nullptr,
2282 Instruction *
I = dyn_cast<Instruction>(Assign->getAddress());
2287 assert(!Assign->getAddressExpression()->getFragmentInfo().has_value() &&
2288 "address-expression shouldn't have fragment info");
2301 Assign->getAddressExpression(), Ops, 0,
false);
2303 "address-expression shouldn't have fragment info");
2308 if (AdditionalValues.
empty()) {
2309 Assign->setAddress(NewV);
2310 Assign->setAddressExpression(SalvagedExpr);
2312 Assign->setKillAddress();
2322 const unsigned MaxDebugArgs = 16;
2323 const unsigned MaxExpressionSize = 128;
2324 bool Salvaged =
false;
2326 for (
auto *DII : DbgUsers) {
2327 if (
auto *DAI = dyn_cast<DbgAssignIntrinsic>(DII)) {
2328 if (DAI->getAddress() == &
I) {
2332 if (DAI->getValue() != &
I)
2338 bool StackValue = isa<DbgValueInst>(DII);
2339 auto DIILocation = DII->location_ops();
2342 "DbgVariableIntrinsic must use salvaged instruction as its location");
2348 Value *Op0 =
nullptr;
2350 auto LocItr =
find(DIILocation, &
I);
2351 while (SalvagedExpr && LocItr != DIILocation.end()) {
2353 unsigned LocNo = std::distance(DIILocation.begin(), LocItr);
2360 LocItr = std::find(++LocItr, DIILocation.end(), &
I);
2368 DII->replaceVariableLocationOp(&
I, Op0);
2369 bool IsValidSalvageExpr = SalvagedExpr->
getNumElements() <= MaxExpressionSize;
2370 if (AdditionalValues.
empty() && IsValidSalvageExpr) {
2371 DII->setExpression(SalvagedExpr);
2372 }
else if (isa<DbgValueInst>(DII) && IsValidSalvageExpr &&
2373 DII->getNumVariableLocationOps() + AdditionalValues.
size() <=
2375 DII->addVariableLocationOps(AdditionalValues, SalvagedExpr);
2380 DII->setKillLocation();
2386 for (
auto *DVR : DPUsers) {
2387 if (DVR->isDbgAssign()) {
2388 if (DVR->getAddress() == &
I) {
2392 if (DVR->getValue() != &
I)
2400 DVR->getType() != DbgVariableRecord::LocationType::Declare;
2401 auto DVRLocation = DVR->location_ops();
2404 "DbgVariableIntrinsic must use salvaged instruction as its location");
2410 Value *Op0 =
nullptr;
2412 auto LocItr =
find(DVRLocation, &
I);
2413 while (SalvagedExpr && LocItr != DVRLocation.end()) {
2415 unsigned LocNo = std::distance(DVRLocation.begin(), LocItr);
2422 LocItr = std::find(++LocItr, DVRLocation.end(), &
I);
2430 DVR->replaceVariableLocationOp(&
I, Op0);
2431 bool IsValidSalvageExpr =
2433 if (AdditionalValues.
empty() && IsValidSalvageExpr) {
2434 DVR->setExpression(SalvagedExpr);
2435 }
else if (DVR->getType() != DbgVariableRecord::LocationType::Declare &&
2436 IsValidSalvageExpr &&
2437 DVR->getNumVariableLocationOps() + AdditionalValues.
size() <=
2439 DVR->addVariableLocationOps(AdditionalValues, SalvagedExpr);
2445 DVR->setKillLocation();
2454 for (
auto *DII : DbgUsers)
2455 DII->setKillLocation();
2457 for (
auto *DVR : DPUsers)
2458 DVR->setKillLocation();
2465 unsigned BitWidth =
DL.getIndexSizeInBits(
GEP->getPointerAddressSpace());
2469 if (!
GEP->collectOffset(
DL,
BitWidth, VariableOffsets, ConstantOffset))
2471 if (!VariableOffsets.
empty() && !CurrentLocOps) {
2472 Opcodes.
insert(Opcodes.
begin(), {dwarf::DW_OP_LLVM_arg, 0});
2475 for (
const auto &
Offset : VariableOffsets) {
2478 "Expected strictly positive multiplier for offset.");
2480 Offset.second.getZExtValue(), dwarf::DW_OP_mul,
2481 dwarf::DW_OP_plus});
2484 return GEP->getOperand(0);
2489 case Instruction::Add:
2490 return dwarf::DW_OP_plus;
2491 case Instruction::Sub:
2492 return dwarf::DW_OP_minus;
2493 case Instruction::Mul:
2494 return dwarf::DW_OP_mul;
2495 case Instruction::SDiv:
2496 return dwarf::DW_OP_div;
2497 case Instruction::SRem:
2498 return dwarf::DW_OP_mod;
2499 case Instruction::Or:
2500 return dwarf::DW_OP_or;
2501 case Instruction::And:
2502 return dwarf::DW_OP_and;
2503 case Instruction::Xor:
2504 return dwarf::DW_OP_xor;
2505 case Instruction::Shl:
2506 return dwarf::DW_OP_shl;
2507 case Instruction::LShr:
2508 return dwarf::DW_OP_shr;
2509 case Instruction::AShr:
2510 return dwarf::DW_OP_shra;
2521 if (!CurrentLocOps) {
2526 AdditionalValues.
push_back(
I->getOperand(1));
2533 auto *ConstInt = dyn_cast<ConstantInt>(BI->
getOperand(1));
2535 if (ConstInt && ConstInt->getBitWidth() > 64)
2541 uint64_t Val = ConstInt->getSExtValue();
2544 if (BinOpcode == Instruction::Add || BinOpcode == Instruction::Sub) {
2545 uint64_t Offset = BinOpcode == Instruction::Add ? Val : -int64_t(Val);
2549 Opcodes.
append({dwarf::DW_OP_constu, Val});
2568 return dwarf::DW_OP_eq;
2570 return dwarf::DW_OP_ne;
2573 return dwarf::DW_OP_gt;
2576 return dwarf::DW_OP_ge;
2579 return dwarf::DW_OP_lt;
2582 return dwarf::DW_OP_le;
2592 auto *ConstInt = dyn_cast<ConstantInt>(Icmp->
getOperand(1));
2594 if (ConstInt && ConstInt->getBitWidth() > 64)
2602 uint64_t Val = ConstInt->getSExtValue();
2620 auto &M = *
I.getModule();
2621 auto &
DL = M.getDataLayout();
2623 if (
auto *CI = dyn_cast<CastInst>(&
I)) {
2624 Value *FromValue = CI->getOperand(0);
2626 if (CI->isNoopCast(
DL)) {
2635 !(isa<TruncInst>(&
I) || isa<SExtInst>(&
I) || isa<ZExtInst>(&
I) ||
2636 isa<IntToPtrInst>(&
I) || isa<PtrToIntInst>(&
I)))
2640 if (FromType->isPointerTy())
2641 FromType =
DL.getIntPtrType(FromType);
2643 unsigned FromTypeBitSize = FromType->getScalarSizeInBits();
2648 Ops.
append(ExtOps.begin(), ExtOps.end());
2652 if (
auto *
GEP = dyn_cast<GetElementPtrInst>(&
I))
2654 if (
auto *BI = dyn_cast<BinaryOperator>(&
I))
2656 if (
auto *IC = dyn_cast<ICmpInst>(&
I))
2683 bool Changed =
false;
2687 if (isa<Instruction>(&To)) {
2688 bool DomPointAfterFrom =
From.getNextNonDebugInstruction() == &DomPoint;
2690 for (
auto *DII :
Users) {
2700 }
else if (!DT.
dominates(&DomPoint, DII)) {
2701 UndefOrSalvage.
insert(DII);
2706 for (
auto *DVR : DPUsers) {
2710 if (isa<DbgVariableIntrinsic>(NextNonDebug))
2713 if (DomPointAfterFrom && NextNonDebug == &DomPoint) {
2717 DomPoint.
getParent()->insertDbgRecordAfter(DVR, &DomPoint);
2719 }
else if (!DT.
dominates(&DomPoint, MarkedInstr)) {
2720 UndefOrSalvageDVR.
insert(DVR);
2726 for (
auto *DII :
Users) {
2727 if (UndefOrSalvage.
count(DII))
2739 for (
auto *DVR : DPUsers) {
2740 if (UndefOrSalvageDVR.
count(DVR))
2753 if (!UndefOrSalvage.
empty() || !UndefOrSalvageDVR.
empty()) {
2777 bool SameSize =
DL.getTypeSizeInBits(FromTy) ==
DL.getTypeSizeInBits(ToTy);
2778 bool LosslessConversion = !
DL.isNonIntegralPointerType(FromTy) &&
2779 !
DL.isNonIntegralPointerType(ToTy);
2780 return SameSize && LosslessConversion;
2790 if (!
From.isUsedByMetadata())
2793 assert(&
From != &To &&
"Can't replace something with itself");
2802 return DVR.getExpression();
2816 assert(FromBits != ToBits &&
"Unexpected no-op conversion");
2820 if (FromBits < ToBits)
2831 return std::nullopt;
2833 bool Signed = *Signedness == DIBasicType::Signedness::Signed;
2845 return std::nullopt;
2847 bool Signed = *Signedness == DIBasicType::Signedness::Signed;
2861 bool Changed =
false;
2863 I->dropDbgRecords();
2864 for (
Use &U :
I->operands()) {
2866 if (isa<Instruction>(
Op) && !
Op->getType()->isTokenTy()) {
2876std::pair<unsigned, unsigned>
2878 unsigned NumDeadInst = 0;
2879 unsigned NumDeadDbgInst = 0;
2886 while (EndInst != &BB->
front()) {
2898 if (isa<DbgInfoIntrinsic>(Inst))
2906 return {NumDeadInst, NumDeadDbgInst};
2922 Successor->removePredecessor(BB, PreserveLCSSA);
2927 UI->setDebugLoc(
I->getDebugLoc());
2930 unsigned NumInstrsRemoved = 0;
2932 while (BBI != BBE) {
2933 if (!BBI->use_empty())
2935 BBI++->eraseFromParent();
2941 for (
BasicBlock *UniqueSuccessor : UniqueSuccessors)
2942 Updates.
push_back({DominatorTree::Delete, BB, UniqueSuccessor});
2946 return NumInstrsRemoved;
2952 II->getOperandBundlesAsDefs(OpBundles);
2954 II->getCalledOperand(), Args, OpBundles);
2965 auto NewWeights =
uint32_t(TotalWeight) != TotalWeight
2968 NewCall->
setMetadata(LLVMContext::MD_prof, NewWeights);
2979 II->replaceAllUsesWith(NewCall);
2989 II->eraseFromParent();
2991 DTU->
applyUpdates({{DominatorTree::Delete, BB, UnwindDestBB}});
3020 UnwindEdge, InvokeArgs, OpBundles, CI->
getName(), BB);
3024 II->setMetadata(LLVMContext::MD_prof, CI->
getMetadata(LLVMContext::MD_prof));
3027 DTU->
applyUpdates({{DominatorTree::Insert, BB, UnwindEdge}});
3034 Split->front().eraseFromParent();
3045 bool Changed =
false;
3053 if (
auto *CI = dyn_cast<CallInst>(&
I)) {
3054 Value *Callee = CI->getCalledOperand();
3056 if (
Function *
F = dyn_cast<Function>(Callee)) {
3057 auto IntrinsicID =
F->getIntrinsicID();
3062 if (IntrinsicID == Intrinsic::assume) {
3069 }
else if (IntrinsicID == Intrinsic::experimental_guard) {
3080 if (!isa<UnreachableInst>(CI->getNextNode())) {
3086 }
else if ((isa<ConstantPointerNull>(Callee) &&
3088 cast<PointerType>(Callee->getType())
3089 ->getAddressSpace())) ||
3090 isa<UndefValue>(Callee)) {
3095 if (CI->doesNotReturn() && !CI->isMustTailCall()) {
3099 if (!isa<UnreachableInst>(CI->getNextNonDebugInstruction())) {
3106 }
else if (
auto *SI = dyn_cast<StoreInst>(&
I)) {
3112 if (SI->isVolatile())
continue;
3116 if (isa<UndefValue>(
Ptr) ||
3117 (isa<ConstantPointerNull>(
Ptr) &&
3119 SI->getPointerAddressSpace()))) {
3128 if (
auto *
II = dyn_cast<InvokeInst>(Terminator)) {
3130 Value *Callee =
II->getCalledOperand();
3131 if ((isa<ConstantPointerNull>(Callee) &&
3133 isa<UndefValue>(Callee)) {
3137 if (
II->doesNotReturn() &&
3138 !isa<UnreachableInst>(
II->getNormalDest()->front())) {
3148 Ctx, OrigNormalDest->
getName() +
".unreachable",
3149 II->getFunction(), OrigNormalDest);
3151 II->setNormalDest(UnreachableNormalDest);
3154 {{DominatorTree::Delete, BB, OrigNormalDest},
3155 {DominatorTree::Insert, BB, UnreachableNormalDest}});
3159 if (
II->use_empty() && !
II->mayHaveSideEffects()) {
3165 II->eraseFromParent();
3167 DTU->applyUpdates({{DominatorTree::Delete, BB, UnwindDestBB}});
3173 }
else if (
auto *CatchSwitch = dyn_cast<CatchSwitchInst>(Terminator)) {
3175 struct CatchPadDenseMapInfo {
3190 if (
LHS == getEmptyKey() ||
LHS == getTombstoneKey() ||
3191 RHS == getEmptyKey() ||
RHS == getTombstoneKey())
3193 return LHS->isIdenticalTo(
RHS);
3204 E = CatchSwitch->handler_end();
3208 ++NumPerSuccessorCases[HandlerBB];
3209 auto *CatchPad = cast<CatchPadInst>(HandlerBB->
getFirstNonPHI());
3210 if (!HandlerSet.insert({CatchPad, Empty}).second) {
3212 --NumPerSuccessorCases[HandlerBB];
3213 CatchSwitch->removeHandler(
I);
3220 std::vector<DominatorTree::UpdateType> Updates;
3221 for (
const std::pair<BasicBlock *, int> &
I : NumPerSuccessorCases)
3223 Updates.push_back({DominatorTree::Delete, BB,
I.first});
3224 DTU->applyUpdates(Updates);
3232 }
while (!Worklist.
empty());
3239 if (
auto *
II = dyn_cast<InvokeInst>(TI))
3245 if (
auto *CRI = dyn_cast<CleanupReturnInst>(TI)) {
3247 UnwindDest = CRI->getUnwindDest();
3248 }
else if (
auto *CatchSwitch = dyn_cast<CatchSwitchInst>(TI)) {
3250 CatchSwitch->getParentPad(),
nullptr, CatchSwitch->getNumHandlers(),
3251 CatchSwitch->getName(), CatchSwitch->getIterator());
3252 for (
BasicBlock *PadBB : CatchSwitch->handlers())
3253 NewCatchSwitch->addHandler(PadBB);
3255 NewTI = NewCatchSwitch;
3256 UnwindDest = CatchSwitch->getUnwindDest();
3267 DTU->
applyUpdates({{DominatorTree::Delete, BB, UnwindDest}});
3280 if (Reachable.
size() ==
F.size())
3289 if (Reachable.
count(&BB))
3294 BlocksToRemove.
insert(&BB);
3297 if (BlocksToRemove.
empty())
3301 NumRemoved += BlocksToRemove.
size();
3314 K->dropUnknownNonDebugMetadata(KnownIDs);
3315 K->getAllMetadataOtherThanDebugLoc(
Metadata);
3317 unsigned Kind = MD.first;
3323 K->setMetadata(Kind,
nullptr);
3325 case LLVMContext::MD_dbg:
3327 case LLVMContext::MD_DIAssignID:
3328 K->mergeDIAssignID(J);
3330 case LLVMContext::MD_tbaa:
3334 case LLVMContext::MD_alias_scope:
3338 case LLVMContext::MD_noalias:
3339 case LLVMContext::MD_mem_parallel_loop_access:
3343 case LLVMContext::MD_access_group:
3345 K->setMetadata(LLVMContext::MD_access_group,
3348 case LLVMContext::MD_range:
3349 if (DoesKMove || !K->hasMetadata(LLVMContext::MD_noundef))
3352 case LLVMContext::MD_fpmath:
3355 case LLVMContext::MD_invariant_load:
3359 K->setMetadata(Kind, JMD);
3361 case LLVMContext::MD_nonnull:
3362 if (DoesKMove || !K->hasMetadata(LLVMContext::MD_noundef))
3363 K->setMetadata(Kind, JMD);
3365 case LLVMContext::MD_invariant_group:
3368 case LLVMContext::MD_mmra:
3371 case LLVMContext::MD_align:
3372 if (DoesKMove || !K->hasMetadata(LLVMContext::MD_noundef))
3376 case LLVMContext::MD_dereferenceable:
3377 case LLVMContext::MD_dereferenceable_or_null:
3379 K->setMetadata(Kind,
3382 case LLVMContext::MD_preserve_access_index:
3385 case LLVMContext::MD_noundef:
3388 K->setMetadata(Kind, JMD);
3390 case LLVMContext::MD_nontemporal:
3392 K->setMetadata(Kind, JMD);
3394 case LLVMContext::MD_prof:
3398 case LLVMContext::MD_noalias_addrspace:
3400 K->setMetadata(Kind,
3411 if (
auto *JMD = J->
getMetadata(LLVMContext::MD_invariant_group))
3412 if (isa<LoadInst>(K) || isa<StoreInst>(K))
3413 K->setMetadata(LLVMContext::MD_invariant_group, JMD);
3418 auto JMMRA = J->
getMetadata(LLVMContext::MD_mmra);
3419 auto KMMRA = K->getMetadata(LLVMContext::MD_mmra);
3420 if (JMMRA || KMMRA) {
3421 K->setMetadata(LLVMContext::MD_mmra,
3428 unsigned KnownIDs[] = {LLVMContext::MD_tbaa,
3429 LLVMContext::MD_alias_scope,
3430 LLVMContext::MD_noalias,
3431 LLVMContext::MD_range,
3432 LLVMContext::MD_fpmath,
3433 LLVMContext::MD_invariant_load,
3434 LLVMContext::MD_nonnull,
3435 LLVMContext::MD_invariant_group,
3436 LLVMContext::MD_align,
3437 LLVMContext::MD_dereferenceable,
3438 LLVMContext::MD_dereferenceable_or_null,
3439 LLVMContext::MD_access_group,
3440 LLVMContext::MD_preserve_access_index,
3441 LLVMContext::MD_prof,
3442 LLVMContext::MD_nontemporal,
3443 LLVMContext::MD_noundef,
3444 LLVMContext::MD_mmra,
3445 LLVMContext::MD_noalias_addrspace};
3451 Source.getAllMetadata(MD);
3455 for (
const auto &MDPair : MD) {
3456 unsigned ID = MDPair.first;
3466 case LLVMContext::MD_dbg:
3467 case LLVMContext::MD_tbaa:
3468 case LLVMContext::MD_prof:
3469 case LLVMContext::MD_fpmath:
3470 case LLVMContext::MD_tbaa_struct:
3471 case LLVMContext::MD_invariant_load:
3472 case LLVMContext::MD_alias_scope:
3473 case LLVMContext::MD_noalias:
3474 case LLVMContext::MD_nontemporal:
3475 case LLVMContext::MD_mem_parallel_loop_access:
3476 case LLVMContext::MD_access_group:
3477 case LLVMContext::MD_noundef:
3482 case LLVMContext::MD_nonnull:
3486 case LLVMContext::MD_align:
3487 case LLVMContext::MD_dereferenceable:
3488 case LLVMContext::MD_dereferenceable_or_null:
3494 case LLVMContext::MD_range:
3502 auto *ReplInst = dyn_cast<Instruction>(Repl);
3511 if (isa<OverflowingBinaryOperator>(ReplInst) &&
3518 else if (!isa<LoadInst>(
I))
3519 ReplInst->andIRFlags(
I);
3522 if (
auto *CB1 = dyn_cast<CallBase>(ReplInst)) {
3523 if (
auto *CB2 = dyn_cast<CallBase>(
I)) {
3524 bool Success = CB1->tryIntersectAttributes(CB2);
3525 assert(
Success &&
"We should not be trying to sink callbases "
3526 "with non-intersectable attributes");
3544template <
typename RootType,
typename ShouldReplaceFn>
3546 const RootType &Root,
3547 const ShouldReplaceFn &ShouldReplace) {
3552 auto *
II = dyn_cast<IntrinsicInst>(U.getUser());
3553 if (
II &&
II->getIntrinsicID() == Intrinsic::fake_use)
3555 if (!ShouldReplace(Root, U))
3559 dbgs() <<
"' with " << *To <<
" in " << *U.getUser() <<
"\n");
3568 auto *BB =
From->getParent();
3572 auto *
I = cast<Instruction>(U.getUser());
3573 if (
I->getParent() == BB)
3587 return ::replaceDominatedUsesWith(
From, To, Root, Dominates);
3593 auto Dominates = [&DT](
const BasicBlock *BB,
const Use &U) {
3596 return ::replaceDominatedUsesWith(
From, To, BB, Dominates);
3602 auto DominatesAndShouldReplace =
3604 return DT.
dominates(Root, U) && ShouldReplace(U, To);
3606 return ::replaceDominatedUsesWith(
From, To, Root, DominatesAndShouldReplace);
3612 auto DominatesAndShouldReplace = [&DT, &ShouldReplace,
3614 return DT.
dominates(BB, U) && ShouldReplace(U, To);
3616 return ::replaceDominatedUsesWith(
From, To, BB, DominatesAndShouldReplace);
3622 if (Call->hasFnAttr(
"gc-leaf-function"))
3624 if (
const Function *
F = Call->getCalledFunction()) {
3625 if (
F->hasFnAttribute(
"gc-leaf-function"))
3628 if (
auto IID =
F->getIntrinsicID()) {
3630 return IID != Intrinsic::experimental_gc_statepoint &&
3631 IID != Intrinsic::experimental_deoptimize &&
3632 IID != Intrinsic::memcpy_element_unordered_atomic &&
3633 IID != Intrinsic::memmove_element_unordered_atomic;
3650 auto *NewTy = NewLI.
getType();
3653 if (NewTy->isPointerTy()) {
3660 if (!NewTy->isIntegerTy())
3665 auto *ITy = cast<IntegerType>(NewTy);
3675 auto *NewTy = NewLI.
getType();
3677 if (NewTy == OldLI.
getType()) {
3686 if (!NewTy->isPointerTy())
3689 unsigned BitWidth =
DL.getPointerTypeSizeInBits(NewTy);
3701 for (
auto *DII : DbgUsers)
3703 for (
auto *DVR : DPUsers)
3704 DVR->eraseFromParent();
3733 I->dropUBImplyingAttrsAndMetadata();
3734 if (
I->isUsedByMetadata())
3737 I->dropDbgRecords();
3738 if (
I->isDebugOrPseudoInst()) {
3740 II =
I->eraseFromParent();
3754 const APInt &API = cast<ConstantInt>(&CV)->getValue();
3755 std::optional<int64_t> InitIntOpt = API.
trySExtValue();
3757 static_cast<uint64_t>(*InitIntOpt))
3761 if (isa<ConstantInt>(
C))
3762 return createIntegerExpression(
C);
3764 auto *
FP = dyn_cast<ConstantFP>(&
C);
3776 if (isa<ConstantPointerNull>(
C))
3780 if (CE->getOpcode() == Instruction::IntToPtr) {
3781 const Value *V = CE->getOperand(0);
3782 if (
auto CI = dyn_cast_or_null<ConstantInt>(V))
3783 return createIntegerExpression(*CI);
3789 auto RemapDebugOperands = [&Mapping](
auto *DV,
auto Set) {
3790 for (
auto *
Op : Set) {
3792 if (
I != Mapping.
end())
3793 DV->replaceVariableLocationOp(
Op,
I->second,
true);
3796 auto RemapAssignAddress = [&Mapping](
auto *DA) {
3797 auto I = Mapping.
find(DA->getAddress());
3798 if (
I != Mapping.
end())
3799 DA->setAddress(
I->second);
3801 if (
auto DVI = dyn_cast<DbgVariableIntrinsic>(Inst))
3802 RemapDebugOperands(DVI, DVI->location_ops());
3803 if (
auto DAI = dyn_cast<DbgAssignIntrinsic>(Inst))
3804 RemapAssignAddress(DAI);
3806 RemapDebugOperands(&DVR, DVR.location_ops());
3807 if (DVR.isDbgAssign())
3808 RemapAssignAddress(&DVR);
3817 BitPart(
Value *
P,
unsigned BW) : Provider(
P) {
3818 Provenance.resize(BW);
3828 enum { Unset = -1 };
3860static const std::optional<BitPart> &
3862 std::map<
Value *, std::optional<BitPart>> &BPS,
int Depth,
3864 auto [
I, Inserted] = BPS.try_emplace(V);
3868 auto &Result =
I->second;
3869 auto BitWidth = V->getType()->getScalarSizeInBits();
3877 LLVM_DEBUG(
dbgs() <<
"collectBitParts max recursion depth reached.\n");
3881 if (
auto *
I = dyn_cast<Instruction>(V)) {
3889 Depth + 1, FoundRoot);
3890 if (!
A || !
A->Provider)
3894 Depth + 1, FoundRoot);
3895 if (!
B ||
A->Provider !=
B->Provider)
3899 Result = BitPart(
A->Provider,
BitWidth);
3900 for (
unsigned BitIdx = 0; BitIdx <
BitWidth; ++BitIdx) {
3901 if (
A->Provenance[BitIdx] != BitPart::Unset &&
3902 B->Provenance[BitIdx] != BitPart::Unset &&
3903 A->Provenance[BitIdx] !=
B->Provenance[BitIdx])
3904 return Result = std::nullopt;
3906 if (
A->Provenance[BitIdx] == BitPart::Unset)
3907 Result->Provenance[BitIdx] =
B->Provenance[BitIdx];
3909 Result->Provenance[BitIdx] =
A->Provenance[BitIdx];
3917 const APInt &BitShift = *
C;
3924 if (!MatchBitReversals && (BitShift.
getZExtValue() % 8) != 0)
3928 Depth + 1, FoundRoot);
3934 auto &
P = Result->Provenance;
3935 if (
I->getOpcode() == Instruction::Shl) {
3949 const APInt &AndMask = *
C;
3953 unsigned NumMaskedBits = AndMask.
popcount();
3954 if (!MatchBitReversals && (NumMaskedBits % 8) != 0)
3958 Depth + 1, FoundRoot);
3963 for (
unsigned BitIdx = 0; BitIdx <
BitWidth; ++BitIdx)
3965 if (AndMask[BitIdx] == 0)
3966 Result->Provenance[BitIdx] = BitPart::Unset;
3973 Depth + 1, FoundRoot);
3977 Result = BitPart(Res->Provider,
BitWidth);
3978 auto NarrowBitWidth =
X->getType()->getScalarSizeInBits();
3979 for (
unsigned BitIdx = 0; BitIdx < NarrowBitWidth; ++BitIdx)
3980 Result->Provenance[BitIdx] = Res->Provenance[BitIdx];
3981 for (
unsigned BitIdx = NarrowBitWidth; BitIdx <
BitWidth; ++BitIdx)
3982 Result->Provenance[BitIdx] = BitPart::Unset;
3989 Depth + 1, FoundRoot);
3993 Result = BitPart(Res->Provider,
BitWidth);
3994 for (
unsigned BitIdx = 0; BitIdx <
BitWidth; ++BitIdx)
3995 Result->Provenance[BitIdx] = Res->Provenance[BitIdx];
4003 Depth + 1, FoundRoot);
4007 Result = BitPart(Res->Provider,
BitWidth);
4008 for (
unsigned BitIdx = 0; BitIdx <
BitWidth; ++BitIdx)
4009 Result->Provenance[(
BitWidth - 1) - BitIdx] = Res->Provenance[BitIdx];
4016 Depth + 1, FoundRoot);
4021 Result = BitPart(Res->Provider,
BitWidth);
4022 for (
unsigned ByteIdx = 0; ByteIdx < ByteWidth; ++ByteIdx) {
4023 unsigned ByteBitOfs = ByteIdx * 8;
4024 for (
unsigned BitIdx = 0; BitIdx < 8; ++BitIdx)
4025 Result->Provenance[(
BitWidth - 8 - ByteBitOfs) + BitIdx] =
4026 Res->Provenance[ByteBitOfs + BitIdx];
4043 if (!MatchBitReversals && (ModAmt % 8) != 0)
4048 Depth + 1, FoundRoot);
4049 if (!
LHS || !
LHS->Provider)
4053 Depth + 1, FoundRoot);
4054 if (!
RHS ||
LHS->Provider !=
RHS->Provider)
4057 unsigned StartBitRHS =
BitWidth - ModAmt;
4059 for (
unsigned BitIdx = 0; BitIdx < StartBitRHS; ++BitIdx)
4060 Result->Provenance[BitIdx + ModAmt] =
LHS->Provenance[BitIdx];
4061 for (
unsigned BitIdx = 0; BitIdx < ModAmt; ++BitIdx)
4062 Result->Provenance[BitIdx] =
RHS->Provenance[BitIdx + StartBitRHS];
4076 for (
unsigned BitIdx = 0; BitIdx <
BitWidth; ++BitIdx)
4077 Result->Provenance[BitIdx] = BitIdx;
4083 if (
From % 8 != To % 8)
4098 Instruction *
I,
bool MatchBSwaps,
bool MatchBitReversals,
4105 if (!MatchBSwaps && !MatchBitReversals)
4107 Type *ITy =
I->getType();
4112 bool FoundRoot =
false;
4113 std::map<Value *, std::optional<BitPart>> BPS;
4120 [](int8_t
I) {
return I == BitPart::Unset || 0 <=
I; }) &&
4121 "Illegal bit provenance index");
4124 Type *DemandedTy = ITy;
4125 if (BitProvenance.
back() == BitPart::Unset) {
4126 while (!BitProvenance.
empty() && BitProvenance.
back() == BitPart::Unset)
4127 BitProvenance = BitProvenance.
drop_back();
4128 if (BitProvenance.
empty())
4131 if (
auto *IVecTy = dyn_cast<VectorType>(ITy))
4132 DemandedTy = VectorType::get(DemandedTy, IVecTy);
4143 bool OKForBSwap = MatchBSwaps && (DemandedBW % 16) == 0;
4144 bool OKForBitReverse = MatchBitReversals;
4145 for (
unsigned BitIdx = 0;
4146 (BitIdx < DemandedBW) && (OKForBSwap || OKForBitReverse); ++BitIdx) {
4147 if (BitProvenance[BitIdx] == BitPart::Unset) {
4154 BitIdx, DemandedBW);
4159 Intrin = Intrinsic::bswap;
4160 else if (OKForBitReverse)
4161 Intrin = Intrinsic::bitreverse;
4167 Value *Provider = Res->Provider;
4170 if (DemandedTy != Provider->
getType()) {
4181 auto *Mask = ConstantInt::get(DemandedTy, DemandedMask);
4187 if (ITy != Result->getType()) {
4204 if (
F && !
F->hasLocalLinkage() &&
F->hasName() &&
4206 !
F->doesNotAccessMemory())
4212 if (
I->getOperand(OpIdx)->getType()->isMetadataTy())
4216 if (!isa<Constant>(
I->getOperand(OpIdx)))
4219 switch (
I->getOpcode()) {
4222 case Instruction::Call:
4223 case Instruction::Invoke: {
4224 const auto &CB = cast<CallBase>(*
I);
4227 if (CB.isInlineAsm())
4232 if (CB.isBundleOperand(OpIdx))
4235 if (OpIdx < CB.arg_size()) {
4238 if (isa<IntrinsicInst>(CB) &&
4239 OpIdx >= CB.getFunctionType()->getNumParams()) {
4241 return CB.getIntrinsicID() == Intrinsic::experimental_stackmap;
4246 if (CB.getIntrinsicID() == Intrinsic::gcroot)
4250 return !CB.paramHasAttr(OpIdx, Attribute::ImmArg);
4255 return !isa<IntrinsicInst>(CB);
4257 case Instruction::ShuffleVector:
4260 case Instruction::Switch:
4261 case Instruction::ExtractValue:
4264 case Instruction::InsertValue:
4267 case Instruction::Alloca:
4271 return !cast<AllocaInst>(
I)->isStaticAlloca();
4272 case Instruction::GetElementPtr:
4276 for (
auto E = std::next(It, OpIdx); It != E; ++It)
4285 if (
Constant *
C = dyn_cast<Constant>(Condition))
4289 Value *NotCondition;
4291 return NotCondition;
4294 Instruction *Inst = dyn_cast<Instruction>(Condition);
4297 else if (
Argument *Arg = dyn_cast<Argument>(Condition))
4299 assert(Parent &&
"Unsupported condition to invert");
4310 if (Inst && !isa<PHINode>(Inst))
4311 Inverted->insertAfter(Inst);
4321 bool Changed =
false;
4323 if (!
F.hasFnAttribute(Attribute::NoSync) &&
4324 F.doesNotAccessMemory() && !
F.isConvergent()) {
4330 if (!
F.hasFnAttribute(Attribute::NoFree) &&
F.onlyReadsMemory()) {
4331 F.setDoesNotFreeMemory();
4336 if (!
F.hasFnAttribute(Attribute::MustProgress) &&
F.willReturn()) {
4337 F.setMustProgress();
for(const MachineOperand &MO :llvm::drop_begin(OldMI.operands(), Desc.getNumOperands()))
static unsigned getIntrinsicID(const SDNode *N)
This file implements a class to represent arbitrary precision integral constant values and operations...
ReachingDefAnalysis InstSet & ToRemove
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static bool isEqual(const Function &Caller, const Function &Callee)
This file contains the simple types necessary to represent the attributes associated with functions a...
static const Function * getParent(const Value *V)
BlockVerifier::State From
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static bool isSentinel(const DWARFDebugNames::AttributeEncoding &AE)
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file defines DenseMapInfo traits for DenseMap.
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
This file contains constants used for implementing Dwarf debug support.
static unsigned getHashValueImpl(SimpleValue Val)
static bool isEqualImpl(SimpleValue LHS, SimpleValue RHS)
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
Module.h This file contains the declarations for the Module class.
This defines the Use class.
iv Induction Variable Users
This file provides utility for Memory Model Relaxation Annotations (MMRAs).
uint64_t IntrinsicInst * II
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
This file contains the declarations for profiling metadata utility functions.
const SmallVectorImpl< MachineOperand > & Cond
Remove Loads Into Fake Uses
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
APInt bitcastToAPInt() const
Class for arbitrary precision integers.
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
void clearBit(unsigned BitPosition)
Set a given bit to 0.
uint64_t getZExtValue() const
Get zero extended value.
unsigned popcount() const
Count the number of bits set.
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
const uint64_t * getRawData() const
This function returns a pointer to the internal storage of the APInt.
std::optional< int64_t > trySExtValue() const
Get sign extended value if possible.
int64_t getSExtValue() const
Get sign extended value.
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
an instruction to allocate memory on the stack
Type * getAllocatedType() const
Return the type that is being allocated by the instruction.
bool isArrayAllocation() const
Return true if there is an allocation size parameter to the allocation instruction that is not 1.
This class represents an incoming formal argument to a Function.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
const T & back() const
back - Get the last element.
ArrayRef< T > drop_front(size_t N=1) const
Drop the first N elements of the array.
size_t size() const
size - Get the array size.
ArrayRef< T > drop_back(size_t N=1) const
Drop the last N elements of the array.
bool empty() const
empty - Check if the array is empty.
Value handle that asserts if the Value is deleted.
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
iterator begin()
Instruction iterator methods.
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
bool hasAddressTaken() const
Returns true if there are any uses of this basic block other than direct branches,...
InstListType::const_iterator getFirstNonPHIIt() const
Iterator returning form of getFirstNonPHI.
void insertDbgRecordBefore(DbgRecord *DR, InstListType::iterator Here)
Insert a DbgRecord into a block at the position given by Here.
const Instruction * getFirstNonPHI() const
Returns a pointer to the first instruction in this block that is not a PHINode instruction.
const Instruction & front() const
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
bool isEntryBlock() const
Return true if this is the entry block of the containing function.
void moveAfter(BasicBlock *MovePos)
Unlink this basic block from its current function and insert it right after MovePos in the function M...
bool hasNPredecessors(unsigned N) const
Return true if this block has exactly N predecessors.
const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
void flushTerminatorDbgRecords()
Eject any debug-info trailing at the end of a block.
const Function * getParent() const
Return the enclosing method, or null if none.
const DataLayout & getDataLayout() const
Get the data layout of the module this basic block belongs to.
SymbolTableList< BasicBlock >::iterator eraseFromParent()
Unlink 'this' from the containing function and delete it.
const Instruction * getFirstNonPHIOrDbg(bool SkipPseudoOp=true) const
Returns a pointer to the first instruction in this block that is not a PHINode or a debug intrinsic,...
InstListType::iterator iterator
Instruction iterators...
LLVMContext & getContext() const
Get the context in which this basic block lives.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
bool hasNPredecessorsOrMore(unsigned N) const
Return true if this block has N predecessors or more.
void splice(BasicBlock::iterator ToIt, BasicBlock *FromBB)
Transfer all instructions from FromBB to this basic block at ToIt.
const Instruction & back() const
void removePredecessor(BasicBlock *Pred, bool KeepOneInputPHIs=false)
Update PHI nodes in this BasicBlock before removal of predecessor Pred.
BinaryOps getOpcode() const
static BinaryOperator * CreateNot(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
static BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
This class represents a no-op cast from one type to another.
The address of a basic block.
static BlockAddress * get(Function *F, BasicBlock *BB)
Return a BlockAddress for the specified function and basic block.
Conditional or Unconditional Branch instruction.
static BranchInst * Create(BasicBlock *IfTrue, InsertPosition InsertBefore=nullptr)
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
void setCallingConv(CallingConv::ID CC)
void addFnAttr(Attribute::AttrKind Kind)
Adds the attribute to the function.
void getOperandBundlesAsDefs(SmallVectorImpl< OperandBundleDef > &Defs) const
Return the list of operand bundles attached to this instruction as a vector of OperandBundleDefs.
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
CallingConv::ID getCallingConv() const
Value * getCalledOperand() const
void setAttributes(AttributeList A)
Set the attributes for this call.
FunctionType * getFunctionType() const
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
AttributeList getAttributes() const
Return the attributes for this call.
This class represents a function call, abstracting a target machine's calling convention.
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CastInst * CreateIntegerCast(Value *S, Type *Ty, bool isSigned, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a ZExt, BitCast, or Trunc for int -> int casts.
static CatchSwitchInst * Create(Value *ParentPad, BasicBlock *UnwindDest, unsigned NumHandlers, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CleanupReturnInst * Create(Value *CleanupPad, BasicBlock *UnwindBB=nullptr, InsertPosition InsertBefore=nullptr)
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
@ ICMP_SLT
signed less than
@ ICMP_SLE
signed less or equal
@ ICMP_UGE
unsigned greater or equal
@ ICMP_UGT
unsigned greater than
@ ICMP_SGT
signed greater than
@ ICMP_ULT
unsigned less than
@ ICMP_SGE
signed greater or equal
@ ICMP_ULE
unsigned less or equal
Predicate getPredicate() const
Return the predicate for this instruction.
A constant value that is initialized with an expression using other constant values.
static Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static Constant * getNot(Constant *C)
static Constant * getPtrToInt(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static Constant * getAdd(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
This is the shared class of boolean and integer constants.
static ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
bool contains(const APInt &Val) const
Return true if the specified value is in the set.
This is an important base class in LLVM.
void destroyConstant()
Called if some element of this constant is no longer valid.
DIExpression * createConstantValueExpression(uint64_t Val)
Create an expression for a variable that does not have an address, but does have a constant value.
static DIExpression * append(const DIExpression *Expr, ArrayRef< uint64_t > Ops)
Append the opcodes Ops to DIExpr.
unsigned getNumElements() const
static ExtOps getExtOps(unsigned FromSize, unsigned ToSize, bool Signed)
Returns the ops for a zero- or sign-extension in a DIExpression.
static void appendOffset(SmallVectorImpl< uint64_t > &Ops, int64_t Offset)
Append Ops with operations to apply the Offset.
static DIExpression * appendOpsToArg(const DIExpression *Expr, ArrayRef< uint64_t > Ops, unsigned ArgNo, bool StackValue=false)
Create a copy of Expr by appending the given list of Ops to each instance of the operand DW_OP_LLVM_a...
static std::optional< FragmentInfo > getFragmentInfo(expr_op_iterator Start, expr_op_iterator End)
Retrieve the details of this fragment expression.
DIExpression * foldConstantMath()
Try to shorten an expression with constant math operations that can be evaluated at compile time.
uint64_t getNumLocationOperands() const
Return the number of unique location operands referred to (via DW_OP_LLVM_arg) in this expression; th...
ArrayRef< uint64_t > getElements() const
std::optional< uint64_t > getActiveBits(DIVariable *Var)
Return the number of bits that have an active value, i.e.
uint64_t getElement(unsigned I) const
static DIExpression * prepend(const DIExpression *Expr, uint8_t Flags, int64_t Offset=0)
Prepend DIExpr with a deref and offset operation and optionally turn it into a stack value or/and an ...
static DIExpression * appendExt(const DIExpression *Expr, unsigned FromSize, unsigned ToSize, bool Signed)
Append a zero- or sign-extension to Expr.
std::optional< DIBasicType::Signedness > getSignedness() const
Return the signedness of this variable's type, or std::nullopt if this type is neither signed nor uns...
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
This represents the llvm.dbg.label instruction.
Instruction * MarkedInstr
Link back to the Instruction that owns this marker.
This represents the llvm.dbg.value instruction.
This is the common base class for debug info intrinsics for variables.
iterator_range< location_op_iterator > location_ops() const
Get the locations corresponding to the variable referenced by the debug info intrinsic.
void replaceVariableLocationOp(Value *OldValue, Value *NewValue, bool AllowEmpty=false)
Value * getVariableLocationOp(unsigned OpIdx) const
void setExpression(DIExpression *NewExpr)
DILocalVariable * getVariable() const
unsigned getNumVariableLocationOps() const
bool isAddressOfVariable() const
Does this describe the address of a local variable.
DIExpression * getExpression() const
Record of a variable value-assignment, aka a non instruction representation of the dbg....
bool isAddressOfVariable() const
Does this describe the address of a local variable.
DbgVariableRecord * clone() const
void setExpression(DIExpression *NewExpr)
DIExpression * getExpression() const
Value * getVariableLocationOp(unsigned OpIdx) const
DILocalVariable * getVariable() const
unsigned getNumVariableLocationOps() const
void replaceVariableLocationOp(Value *OldValue, Value *NewValue, bool AllowEmpty=false)
iterator_range< location_op_iterator > location_ops() const
Get the locations corresponding to the variable referenced by the debug info intrinsic.
DILocation * get() const
Get the underlying DILocation.
iterator find(const_arg_type_t< KeyT > Val)
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Implements a dense probed hash-table based set.
void deleteBB(BasicBlock *DelBB)
Delete DelBB.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
const BasicBlock & getEntryBlock() const
void applyUpdatesPermissive(ArrayRef< UpdateT > Updates)
Submit updates to all available trees.
void applyUpdates(ArrayRef< UpdateT > Updates)
Submit updates to all available trees.
bool hasDomTree() const
Returns true if it holds a DomTreeT.
bool isBBPendingDeletion(BasicBlockT *DelBB) const
Returns true if DelBB is awaiting deletion.
void recalculate(FuncT &F)
Notify DTU that the entry block was replaced.
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
This instruction compares its operands according to the predicate given to the constructor.
Value * CreateICmpEQ(Value *LHS, Value *RHS, const Twine &Name="")
BranchInst * CreateCondBr(Value *Cond, BasicBlock *True, BasicBlock *False, MDNode *BranchWeights=nullptr, MDNode *Unpredictable=nullptr)
Create a conditional 'br Cond, TrueDest, FalseDest' instruction.
BranchInst * CreateBr(BasicBlock *Dest)
Create an unconditional 'br label X' instruction.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
iterator_range< simple_ilist< DbgRecord >::iterator > getDbgRecordRange() const
Return a range over the DbgRecords attached to this instruction.
void insertBefore(Instruction *InsertPos)
Insert an unlinked instruction into a basic block immediately before the specified instruction.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
bool extractProfTotalWeight(uint64_t &TotalVal) const
Retrieve total raw weight values of a branch.
void moveAfter(Instruction *MovePos)
Unlink this instruction from its current basic block and insert it into the basic block that MovePos ...
bool isEHPad() const
Return true if the instruction is a variety of EH-block.
InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
bool isIdenticalToWhenDefined(const Instruction *I, bool IntersectAttrs=false) const LLVM_READONLY
This is like isIdenticalTo, except that it ignores the SubclassOptionalData flags,...
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
const Instruction * getNextNonDebugInstruction(bool SkipPseudoOp=false) const
Return a pointer to the next non-debug instruction in the same basic block as 'this',...
void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
void dropPoisonGeneratingFlags()
Drops flags that may cause this instruction to evaluate to poison despite having non-poison inputs.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
void copyMetadata(const Instruction &SrcInst, ArrayRef< unsigned > WL=ArrayRef< unsigned >())
Copy metadata from SrcInst to this instruction.
void dropDbgRecords()
Erase any DbgRecords attached to this instruction.
const DataLayout & getDataLayout() const
Get the data layout of the module this instruction belongs to.
A wrapper class for inspecting calls to intrinsic functions.
static InvokeInst * Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
This is an important class for using LLVM in a threaded context.
An instruction for reading from memory.
Value * getPointerOperand()
MDNode * createBranchWeights(uint32_t TrueWeight, uint32_t FalseWeight, bool IsExpected=false)
Return metadata containing two branch weights.
MDNode * createRange(const APInt &Lo, const APInt &Hi)
Return metadata describing the range [Lo, Hi).
static MDNode * getMostGenericAliasScope(MDNode *A, MDNode *B)
static MDNode * getMostGenericTBAA(MDNode *A, MDNode *B)
static MDNode * getMostGenericNoaliasAddrspace(MDNode *A, MDNode *B)
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static MDNode * getMergedProfMetadata(MDNode *A, MDNode *B, const Instruction *AInstr, const Instruction *BInstr)
Merge !prof metadata from two instructions.
static MDNode * getMostGenericFPMath(MDNode *A, MDNode *B)
static MDNode * getMostGenericRange(MDNode *A, MDNode *B)
static MDNode * intersect(MDNode *A, MDNode *B)
LLVMContext & getContext() const
static MDNode * getMostGenericAlignmentOrDereferenceable(MDNode *A, MDNode *B)
This class implements a map that also provides access to all stored values in a deterministic order.
iterator find(const KeyT &Key)
std::pair< iterator, bool > try_emplace(const KeyT &Key, Ts &&...Args)
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
void changeToUnreachable(const Instruction *I)
Instruction I will be changed to an unreachable.
void removeBlocks(const SmallSetVector< BasicBlock *, 8 > &DeadBlocks)
Remove all MemoryAcceses in a set of BasicBlocks about to be deleted.
void removeMemoryAccess(MemoryAccess *, bool OptimizePhis=false)
Remove a MemoryAccess from MemorySSA, including updating all definitions and uses.
A Module instance is used to store all the information related to an LLVM module.
const DataLayout & getDataLayout() const
Get the data layout for the module's target platform.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
const_block_iterator block_begin() const
Value * removeIncomingValue(unsigned Idx, bool DeletePHIIfEmpty=true)
Remove an incoming value.
void setIncomingValue(unsigned i, Value *V)
const_block_iterator block_end() const
Value * getIncomingValueForBlock(const BasicBlock *BB) const
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
unsigned getNumIncomingValues() const
Return the number of incoming edges.
static PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
size_type size() const
Determine the number of elements in the SetVector.
Vector takeVector()
Clear the SetVector and return the underlying vector.
size_type count(const key_type &key) const
Count the number of elements of a given key in the SetVector.
bool empty() const
Determine if the SetVector is empty or not.
bool insert(const value_type &X)
Insert a new element into the SetVector.
value_type pop_back_val()
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
A SetVector that performs no allocations if smaller than a certain size.
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void reserve(size_type N)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
iterator insert(iterator I, T &&Elt)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
Provides information about what library functions are available for the current target.
bool hasOptimizedCodeGen(LibFunc F) const
Tests if the function is both available and a candidate for optimized code generation.
bool has(LibFunc F) const
Tests whether a library function is available.
bool getLibFunc(StringRef funcName, LibFunc &F) const
Searches for a particular function name.
TinyPtrVector - This class is specialized for cases where there are normally 0 or 1 element in a vect...
static constexpr TypeSize getFixed(ScalarTy ExactSize)
The instances of the Type class are immutable: once they are created, they are never changed.
bool isVectorTy() const
True if this is an instance of VectorType.
bool isArrayTy() const
True if this is an instance of ArrayType.
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
bool isPointerTy() const
True if this is an instance of PointerType.
static IntegerType * getIntNTy(LLVMContext &C, unsigned N)
unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
bool isStructTy() const
True if this is an instance of StructType.
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
bool isIntOrPtrTy() const
Return true if this is an integer type or a pointer type.
static IntegerType * getInt32Ty(LLVMContext &C)
bool isIntegerTy() const
True if this is an instance of IntegerType.
bool isTokenTy() const
Return true if this is 'token'.
TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
static UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
This function has undefined behavior.
A Use represents the edge between a Value definition and its users.
value_op_iterator value_op_end()
Value * getOperand(unsigned i) const
value_op_iterator value_op_begin()
iterator find(const KeyT &Val)
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
iterator_range< user_iterator > users()
void replaceUsesWithIf(Value *New, llvm::function_ref< bool(Use &U)> ShouldReplace)
Go through the uses list for this definition and make each use point to "V" if the callback ShouldRep...
LLVMContext & getContext() const
All values hold a context through their type.
static constexpr unsigned MaxAlignmentExponent
The maximum alignment for instructions.
user_iterator_impl< User > user_iterator
StringRef getName() const
Return a constant reference to the value's name.
void takeName(Value *V)
Transfer the name from V to this value.
Represents an op.with.overflow intrinsic.
std::pair< iterator, bool > insert(const ValueT &V)
void reserve(size_t Size)
Grow the DenseSet so that it can contain at least NumEntries items before resizing again.
An efficient, type-erasing, non-owning reference to a callable.
const ParentTy * getParent() const
self_iterator getIterator()
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > Tys={})
Look up the Function declaration of the intrinsic id in the Module M.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
m_Intrinsic_Ty< Opnd0 >::Ty m_BitReverse(const Opnd0 &Op0)
CastInst_match< OpTy, TruncInst > m_Trunc(const OpTy &Op)
Matches Trunc.
bool match(Val *V, const Pattern &P)
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
BinOpPred_match< LHS, RHS, is_logical_shift_op > m_LogicalShift(const LHS &L, const RHS &R)
Matches logical shift operations.
bind_ty< WithOverflowInst > m_WithOverflowInst(WithOverflowInst *&I)
Match a with overflow intrinsic, capturing it if we match.
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
m_Intrinsic_Ty< Opnd0, Opnd1, Opnd2 >::Ty m_FShl(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2)
apint_match m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
m_Intrinsic_Ty< Opnd0, Opnd1, Opnd2 >::Ty m_FShr(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2)
auto m_Undef()
Match an arbitrary undef constant.
BinaryOp_match< cst_pred_ty< is_all_ones >, ValTy, Instruction::Xor, true > m_Not(const ValTy &V)
Matches a 'Not' as 'xor V, -1' or 'xor -1, V'.
BinaryOp_match< LHS, RHS, Instruction::Or > m_Or(const LHS &L, const RHS &R)
m_Intrinsic_Ty< Opnd0 >::Ty m_BSwap(const Opnd0 &Op0)
is_zero m_Zero()
Match any null constant or a vector with all elements equal to 0.
match_combine_or< LTy, RTy > m_CombineOr(const LTy &L, const RTy &R)
Combine two pattern matchers matching L || R.
initializer< Ty > init(const Ty &Val)
@ DW_OP_LLVM_arg
Only used in LLVM metadata.
@ ebStrict
This corresponds to "fpexcept.strict".
This is an optimization pass for GlobalISel generic memory operations.
auto find(R &&Range, const T &Val)
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly.
bool RemoveRedundantDbgInstrs(BasicBlock *BB)
Try to remove redundant dbg.value instructions from given basic block.
UnaryFunction for_each(R &&Range, UnaryFunction F)
Provide wrappers to std::for_each which take ranges instead of having to pass begin/end explicitly.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
bool RecursivelyDeleteTriviallyDeadInstructions(Value *V, const TargetLibraryInfo *TLI=nullptr, MemorySSAUpdater *MSSAU=nullptr, std::function< void(Value *)> AboutToDeleteCallback=std::function< void(Value *)>())
If the specified value is a trivially dead instruction, delete it.
bool succ_empty(const Instruction *I)
BasicBlock * changeToInvokeAndSplitBasicBlock(CallInst *CI, BasicBlock *UnwindEdge, DomTreeUpdater *DTU=nullptr)
Convert the CallInst to InvokeInst with the specified unwind edge basic block.
bool ConstantFoldTerminator(BasicBlock *BB, bool DeleteDeadConditions=false, const TargetLibraryInfo *TLI=nullptr, DomTreeUpdater *DTU=nullptr)
If a terminator instruction is predicated on a constant value, convert it into an unconditional branc...
unsigned replaceDominatedUsesWithIf(Value *From, Value *To, DominatorTree &DT, const BasicBlockEdge &Edge, function_ref< bool(const Use &U, const Value *To)> ShouldReplace)
Replace each use of 'From' with 'To' if that use is dominated by the given edge and the callback Shou...
TinyPtrVector< DbgDeclareInst * > findDbgDeclares(Value *V)
Finds dbg.declare intrinsics declaring local variables as living in the memory that 'V' points to.
std::pair< unsigned, unsigned > removeAllNonTerminatorAndEHPadInstructions(BasicBlock *BB)
Remove all instructions from a basic block other than its terminator and any present EH pad instructi...
auto pred_end(const MachineBasicBlock *BB)
unsigned replaceNonLocalUsesWith(Instruction *From, Value *To)
void salvageDebugInfoForDbgValues(Instruction &I, ArrayRef< DbgVariableIntrinsic * > Insns, ArrayRef< DbgVariableRecord * > DPInsns)
Implementation of salvageDebugInfo, applying only to instructions in Insns, rather than all debug use...
void findDbgUsers(SmallVectorImpl< DbgVariableIntrinsic * > &DbgInsts, Value *V, SmallVectorImpl< DbgVariableRecord * > *DbgVariableRecords=nullptr)
Finds the debug info intrinsics describing a value.
void salvageDebugInfo(const MachineRegisterInfo &MRI, MachineInstr &MI)
Assuming the instruction MI is going to be deleted, attempt to salvage debug users of MI by writing t...
auto successors(const MachineBasicBlock *BB)
bool isRemovableAlloc(const CallBase *V, const TargetLibraryInfo *TLI)
Return true if this is a call to an allocation function that does not have side effects that we are r...
CallInst * changeToCall(InvokeInst *II, DomTreeUpdater *DTU=nullptr)
This function converts the specified invoke into a normal call.
bool isMathLibCallNoop(const CallBase *Call, const TargetLibraryInfo *TLI)
Check whether the given call has no side-effects.
void copyMetadataForLoad(LoadInst &Dest, const LoadInst &Source)
Copy the metadata from the source instruction to the destination (the replacement for the source inst...
void InsertDebugValueAtStoreLoc(DbgVariableRecord *DVR, StoreInst *SI, DIBuilder &Builder)
===------------------------------------------------------------------—===// Dbg Intrinsic utilities
bool hasNItemsOrLess(IterTy &&Begin, IterTy &&End, unsigned N, Pred &&ShouldBeCounted=[](const decltype(*std::declval< IterTy >()) &) { return true;})
Returns true if the sequence [Begin, End) has N or less items.
void remapDebugVariable(ValueToValueMapTy &Mapping, Instruction *Inst)
Remap the operands of the debug records attached to Inst, and the operands of Inst itself if it's a d...
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
auto pred_size(const MachineBasicBlock *BB)
bool SimplifyInstructionsInBlock(BasicBlock *BB, const TargetLibraryInfo *TLI=nullptr)
Scan the specified basic block and try to simplify any instructions in it and recursively delete dead...
bool isAssumeWithEmptyBundle(const AssumeInst &Assume)
Return true iff the operand bundles of the provided llvm.assume doesn't contain any valuable informat...
void DeleteDeadBlock(BasicBlock *BB, DomTreeUpdater *DTU=nullptr, bool KeepOneInputPHIs=false)
Delete the specified block, which must have no predecessors.
bool hasBranchWeightOrigin(const Instruction &I)
Check if Branch Weight Metadata has an "expected" field from an llvm.expect* intrinsic.
void findDbgValues(SmallVectorImpl< DbgValueInst * > &DbgValues, Value *V, SmallVectorImpl< DbgVariableRecord * > *DbgVariableRecords=nullptr)
Finds the llvm.dbg.value intrinsics describing a value.
void insertDebugValuesForPHIs(BasicBlock *BB, SmallVectorImpl< PHINode * > &InsertedPHIs)
Propagate dbg.value intrinsics through the newly inserted PHIs.
ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
MDNode * intersectAccessGroups(const Instruction *Inst1, const Instruction *Inst2)
Compute the access-group list of access groups that Inst1 and Inst2 are both in.
bool handleUnreachableTerminator(Instruction *I, SmallVectorImpl< Value * > &PoisonedValues)
If a terminator in an unreachable basic block has an operand of type Instruction, transform it into p...
bool canSimplifyInvokeNoUnwind(const Function *F)
Value * simplifyInstruction(Instruction *I, const SimplifyQuery &Q)
See if we can compute a simplified version of this instruction.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
bool isInstructionTriviallyDead(Instruction *I, const TargetLibraryInfo *TLI=nullptr)
Return true if the result produced by the instruction is not used, and the instruction will return.
bool TryToSimplifyUncondBranchFromEmptyBlock(BasicBlock *BB, DomTreeUpdater *DTU=nullptr)
BB is known to contain an unconditional branch, and contains no instructions other than PHI nodes,...
bool recognizeBSwapOrBitReverseIdiom(Instruction *I, bool MatchBSwaps, bool MatchBitReversals, SmallVectorImpl< Instruction * > &InsertedInsts)
Try to match a bswap or bitreverse idiom.
void setBranchWeights(Instruction &I, ArrayRef< uint32_t > Weights, bool IsExpected)
Create a new branch_weights metadata node and add or overwrite a prof metadata reference to instructi...
MDNode * getValidBranchWeightMDNode(const Instruction &I)
Get the valid branch weights metadata node.
Align getOrEnforceKnownAlignment(Value *V, MaybeAlign PrefAlign, const DataLayout &DL, const Instruction *CxtI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr)
Try to ensure that the alignment of V is at least PrefAlign bytes.
bool wouldInstructionBeTriviallyDeadOnUnusedPaths(Instruction *I, const TargetLibraryInfo *TLI=nullptr)
Return true if the result produced by the instruction has no side effects on any paths other than whe...
bool LowerDbgDeclare(Function &F)
Lowers llvm.dbg.declare intrinsics into appropriate set of llvm.dbg.value intrinsics.
bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
DIExpression * getExpressionForConstant(DIBuilder &DIB, const Constant &C, Type &Ty)
Given a constant, create a debug information expression.
CallInst * createCallMatchingInvoke(InvokeInst *II)
Create a call that matches the invoke II in terms of arguments, attributes, debug information,...
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Instruction * removeUnwindEdge(BasicBlock *BB, DomTreeUpdater *DTU=nullptr)
Replace 'BB's terminator with one that does not have an unwind successor block.
bool wouldInstructionBeTriviallyDead(const Instruction *I, const TargetLibraryInfo *TLI=nullptr)
Return true if the result produced by the instruction would have no side effects if it was not used.
void patchReplacementInstruction(Instruction *I, Value *Repl)
Patch the replacement so that it is not more restrictive than the value being replaced.
DebugLoc getDebugValueLoc(DbgVariableIntrinsic *DII)
Produce a DebugLoc to use for each dbg.declare that is promoted to a dbg.value.
void ConvertDebugDeclareToDebugValue(DbgVariableIntrinsic *DII, StoreInst *SI, DIBuilder &Builder)
Inserts a llvm.dbg.value intrinsic before a store to an alloca'd value that has an associated llvm....
unsigned replaceDominatedUsesWith(Value *From, Value *To, DominatorTree &DT, const BasicBlockEdge &Edge)
Replace each use of 'From' with 'To' if that use is dominated by the given edge.
void combineMetadata(Instruction *K, const Instruction *J, ArrayRef< unsigned > KnownIDs, bool DoesKMove)
Combine the metadata of two instructions so that K can replace J.
unsigned changeToUnreachable(Instruction *I, bool PreserveLCSSA=false, DomTreeUpdater *DTU=nullptr, MemorySSAUpdater *MSSAU=nullptr)
Insert an unreachable instruction before the specified instruction, making it and the rest of the cod...
bool replaceAllDbgUsesWith(Instruction &From, Value &To, Instruction &DomPoint, DominatorTree &DT)
Point debug users of From to To or salvage them.
Value * salvageDebugInfoImpl(Instruction &I, uint64_t CurrentLocOps, SmallVectorImpl< uint64_t > &Ops, SmallVectorImpl< Value * > &AdditionalValues)
RNSuccIterator< NodeRef, BlockT, RegionT > succ_begin(NodeRef Node)
void combineMetadataForCSE(Instruction *K, const Instruction *J, bool DoesKMove)
Combine the metadata of two instructions so that K can replace J.
void dropDebugUsers(Instruction &I)
Remove the debug intrinsic instructions for the given instruction.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
void MergeBasicBlockIntoOnlyPred(BasicBlock *BB, DomTreeUpdater *DTU=nullptr)
BB is a block with one predecessor and its predecessor is known to have one successor (BB!...
bool replaceDbgUsesWithUndef(Instruction *I)
Replace all the uses of an SSA value in @llvm.dbg intrinsics with undef.
void hoistAllInstructionsInto(BasicBlock *DomBlock, Instruction *InsertPt, BasicBlock *BB)
Hoist all of the instructions in the IfBlock to the dominant block DomBlock, by moving its instructio...
void copyRangeMetadata(const DataLayout &DL, const LoadInst &OldLI, MDNode *N, LoadInst &NewLI)
Copy a range metadata node to a new load instruction.
void copyNonnullMetadata(const LoadInst &OldLI, MDNode *N, LoadInst &NewLI)
Copy a nonnull metadata node to a new load instruction.
void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, unsigned Depth=0, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
bool canReplaceOperandWithVariable(const Instruction *I, unsigned OpIdx)
Given an instruction, is it legal to set operand OpIdx to a non-constant value?
void replaceDbgValueForAlloca(AllocaInst *AI, Value *NewAllocaAddress, DIBuilder &Builder, int Offset=0)
Replaces multiple llvm.dbg.value instructions when the alloca it describes is replaced with a new val...
Align tryEnforceAlignment(Value *V, Align PrefAlign, const DataLayout &DL)
If the specified pointer points to an object that we control, try to modify the object's alignment to...
Value * getFreedOperand(const CallBase *CB, const TargetLibraryInfo *TLI)
If this if a call to a free function, return the freed operand.
bool RecursivelyDeleteTriviallyDeadInstructionsPermissive(SmallVectorImpl< WeakTrackingVH > &DeadInsts, const TargetLibraryInfo *TLI=nullptr, MemorySSAUpdater *MSSAU=nullptr, std::function< void(Value *)> AboutToDeleteCallback=std::function< void(Value *)>())
Same functionality as RecursivelyDeleteTriviallyDeadInstructions, but allow instructions that are not...
constexpr unsigned BitWidth
bool extractBranchWeights(const MDNode *ProfileData, SmallVectorImpl< uint32_t > &Weights)
Extract branch weights from MD_prof metadata.
auto count_if(R &&Range, UnaryPredicate P)
Wrapper function around std::count_if to count the number of times an element satisfying a given pred...
auto pred_begin(const MachineBasicBlock *BB)
BasicBlock * SplitBlock(BasicBlock *Old, BasicBlock::iterator SplitPt, DominatorTree *DT, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, const Twine &BBName="", bool Before=false)
Split the specified block at the specified instruction.
gep_type_iterator gep_type_begin(const User *GEP)
TinyPtrVector< DbgVariableRecord * > findDVRDeclares(Value *V)
As above, for DVRDeclares.
auto predecessors(const MachineBasicBlock *BB)
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
bool RecursivelyDeleteDeadPHINode(PHINode *PN, const TargetLibraryInfo *TLI=nullptr, MemorySSAUpdater *MSSAU=nullptr)
If the specified value is an effectively dead PHI node, due to being a def-use chain of single-use no...
bool inferAttributesFromOthers(Function &F)
If we can infer one attribute from another on the declaration of a function, explicitly materialize t...
Value * invertCondition(Value *Condition)
Invert the given true/false value, possibly reusing an existing copy.
hash_code hash_combine(const Ts &...args)
Combine values into a single hash_code.
void DeleteDeadBlocks(ArrayRef< BasicBlock * > BBs, DomTreeUpdater *DTU=nullptr, bool KeepOneInputPHIs=false)
Delete the specified blocks from BB.
void maybeMarkSanitizerLibraryCallNoBuiltin(CallInst *CI, const TargetLibraryInfo *TLI)
Given a CallInst, check if it calls a string function known to CodeGen, and mark it with NoBuiltin if...
static auto filterDbgVars(iterator_range< simple_ilist< DbgRecord >::iterator > R)
Filter the DbgRecord range to DbgVariableRecord types only and downcast.
bool removeUnreachableBlocks(Function &F, DomTreeUpdater *DTU=nullptr, MemorySSAUpdater *MSSAU=nullptr)
Remove all blocks that can not be reached from the function's entry.
bool EliminateDuplicatePHINodes(BasicBlock *BB)
Check for and eliminate duplicate PHI nodes in this block.
bool callsGCLeafFunction(const CallBase *Call, const TargetLibraryInfo &TLI)
Return true if this call calls a gc leaf function.
hash_code hash_combine_range(InputIteratorT first, InputIteratorT last)
Compute a hash_code for a sequence of values.
bool replaceDbgDeclare(Value *Address, Value *NewAddress, DIBuilder &Builder, uint8_t DIExprFlags, int Offset)
Replaces llvm.dbg.declare instruction when the address it describes is replaced with a new value.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
This struct is a compact representation of a valid (non-zero power of two) alignment.
An information struct used to provide DenseMap with the various necessary components for a given valu...
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
unsigned getBitWidth() const
Get the bit width of this value.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
A MapVector that performs no allocations if smaller than a certain size.