94#include "llvm/IR/IntrinsicsPowerPC.h"
112#define DEBUG_TYPE "ppc-loop-instr-form-prep"
118 cl::desc(
"Potential common base number threshold per function "
119 "for PPC loop prep"));
123 cl::desc(
"prefer update form when ds form is also a update form"));
127 cl::desc(
"prepare update form when the load/store increment is a loop "
128 "invariant non-const value."));
132 cl::desc(
"Enable chain commoning in PPC loop prepare pass."));
139 cl::desc(
"Potential PHI threshold per loop for PPC loop prep of update "
144 cl::desc(
"Potential PHI threshold per loop for PPC loop prep of DS form"));
148 cl::desc(
"Potential PHI threshold per loop for PPC loop prep of DQ form"));
159 cl::desc(
"Bucket number per loop for PPC loop chain common"));
167 cl::desc(
"Minimal common base load/store instructions triggering DS/DQ form "
172 cl::desc(
"Minimal common base load/store instructions triggering chain "
173 "commoning preparation. Must be not smaller than 4"));
175STATISTIC(PHINodeAlreadyExistsUpdate,
"PHI node already in pre-increment form");
176STATISTIC(PHINodeAlreadyExistsDS,
"PHI node already in DS form");
177STATISTIC(PHINodeAlreadyExistsDQ,
"PHI node already in DQ form");
178STATISTIC(DSFormChainRewritten,
"Num of DS form chain rewritten");
179STATISTIC(DQFormChainRewritten,
"Num of DQ form chain rewritten");
180STATISTIC(UpdFormChainRewritten,
"Num of update form chain rewritten");
181STATISTIC(ChainCommoningRewritten,
"Num of commoning chains");
184 struct BucketElement {
186 BucketElement(Instruction *
I) : Offset(nullptr), Instr(
I) {}
193 Bucket(
const SCEV *
B, Instruction *
I)
194 : BaseSCEV(
B), Elements(1, BucketElement(
I)) {
199 const SCEV *BaseSCEV;
217 enum PrepForm { UpdateForm = 1, DSForm = 4, DQForm = 16, ChainCommoning };
223 PPCLoopInstrFormPrep(PPCTargetMachine &TM) : FunctionPass(ID), TM(&TM) {}
225 void getAnalysisUsage(AnalysisUsage &AU)
const override {
235 PPCTargetMachine *TM =
nullptr;
236 const PPCSubtarget *ST;
241 bool HasCandidateForPrepare;
247 unsigned SuccPrepCount;
249 bool runOnLoop(
Loop *L);
252 bool alreadyPrepared(
Loop *L, Instruction *MemI,
253 const SCEV *BasePtrStartSCEV,
254 const SCEV *BasePtrIncSCEV, PrepForm Form);
257 Value *getNodeForInc(
Loop *L, Instruction *MemI,
258 const SCEV *BasePtrIncSCEV);
264 bool prepareBasesForCommoningChains(Bucket &BucketChain);
267 bool rewriteLoadStoresForCommoningChains(
268 Loop *L, Bucket &Bucket, SmallPtrSet<BasicBlock *, 16> &BBChanged);
274 std::function<
bool(
const Instruction *,
Value *,
const Type *)>
276 std::function<
bool(
const SCEV *)> isValidDiff,
277 unsigned MaxCandidateNum);
281 void addOneCandidate(Instruction *MemI,
const SCEV *LSCEV,
283 std::function<
bool(
const SCEV *)> isValidDiff,
284 unsigned MaxCandidateNum);
299 bool prepareBaseForDispFormChain(Bucket &BucketChain, PrepForm Form);
306 bool prepareBaseForUpdateFormChain(Bucket &BucketChain);
310 bool rewriteLoadStores(
Loop *L, Bucket &BucketChain,
311 SmallPtrSet<BasicBlock *, 16> &BBChanged,
315 std::pair<Instruction *, Instruction *>
316 rewriteForBase(
Loop *L,
const SCEVAddRecExpr *BasePtrSCEV,
317 Instruction *BaseMemI,
bool CanPreInc, PrepForm Form,
318 SCEVExpander &SCEVE, SmallPtrSet<Value *, 16> &DeletedPtrs);
323 rewriteForBucketElement(std::pair<Instruction *, Instruction *>
Base,
324 const BucketElement &Element,
Value *OffToBase,
325 SmallPtrSet<Value *, 16> &DeletedPtrs);
330char PPCLoopInstrFormPrep::ID = 0;
331static const char *
name =
"Prepare loop for ppc preferred instruction forms";
343 return new PPCLoopInstrFormPrep(TM);
347 Value *StrippedBasePtr = BasePtr;
349 StrippedBasePtr = BC->getOperand(0);
351 return GEP->isInBounds();
357 assert(
I &&
"Invalid paramater!");
359 return (
I->getName() + Suffix).str();
365 Type **PtrElementType =
nullptr) {
367 Value *PtrValue =
nullptr;
368 Type *PointerElementType =
nullptr;
371 PtrValue = LMemI->getPointerOperand();
372 PointerElementType = LMemI->getType();
374 PtrValue = SMemI->getPointerOperand();
375 PointerElementType = SMemI->getValueOperand()->getType();
378 if (IMemI->getIntrinsicID() == Intrinsic::prefetch ||
379 IMemI->getIntrinsicID() == Intrinsic::ppc_vsx_lxvp) {
380 PtrValue = IMemI->getArgOperand(0);
381 }
else if (IMemI->getIntrinsicID() == Intrinsic::ppc_vsx_stxvp) {
382 PtrValue = IMemI->getArgOperand(1);
387 *PtrElementType = PointerElementType;
392bool PPCLoopInstrFormPrep::runOnFunction(
Function &
F) {
396 LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
397 SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
398 auto *DTWP = getAnalysisIfAvailable<DominatorTreeWrapperPass>();
399 DT = DTWP ? &DTWP->getDomTree() :
nullptr;
400 PreserveLCSSA = mustPreserveAnalysisID(
LCSSAID);
404 bool MadeChange =
false;
408 MadeChange |= runOnLoop(L);
419bool PPCLoopInstrFormPrep::prepareBasesForCommoningChains(Bucket &CBucket) {
436 "Thredhold can not be smaller than 4!\n");
442 const SCEV *FirstOffset = CBucket.Elements[1].Offset;
447 unsigned FirstOffsetReusedCount = 1;
451 unsigned FirstOffsetReusedCountInFirstChain = 1;
453 unsigned EleNum = CBucket.Elements.size();
454 bool SawChainSeparater =
false;
455 for (
unsigned j = 2;
j != EleNum; ++
j) {
457 CBucket.Elements[j - 1].Offset) == FirstOffset) {
458 if (!SawChainSeparater)
459 FirstOffsetReusedCountInFirstChain++;
460 FirstOffsetReusedCount++;
478 SawChainSeparater =
true;
482 if (FirstOffsetReusedCount == 1)
486 FirstOffsetReusedCount / FirstOffsetReusedCountInFirstChain;
490 if (!SawChainSeparater)
491 ChainNum = (unsigned)sqrt((
double)EleNum);
493 CBucket.ChainSize = (unsigned)(EleNum / ChainNum);
497 if (CBucket.ChainSize * ChainNum != EleNum)
500 if (SawChainSeparater) {
502 for (
unsigned i = 1; i < CBucket.ChainSize; i++)
503 for (
unsigned j = 1;
j < ChainNum;
j++)
504 if (CBucket.Elements[i].Offset !=
505 SE->
getMinusSCEV(CBucket.Elements[i + j * CBucket.ChainSize].Offset,
506 CBucket.Elements[j * CBucket.ChainSize].Offset))
510 for (
unsigned i = 0; i < ChainNum; i++)
511 CBucket.ChainBases.push_back(CBucket.Elements[i * CBucket.ChainSize]);
518bool PPCLoopInstrFormPrep::chainCommoning(
Loop *L,
520 bool MadeChange =
false;
525 SmallPtrSet<BasicBlock *, 16> BBChanged;
527 for (
auto &Bucket : Buckets) {
528 if (prepareBasesForCommoningChains(Bucket))
529 MadeChange |= rewriteLoadStoresForCommoningChains(L, Bucket, BBChanged);
533 for (
auto *BB : BBChanged)
538bool PPCLoopInstrFormPrep::rewriteLoadStoresForCommoningChains(
539 Loop *L, Bucket &Bucket, SmallPtrSet<BasicBlock *, 16> &BBChanged) {
540 bool MadeChange =
false;
542 assert(Bucket.Elements.size() ==
543 Bucket.ChainBases.size() * Bucket.ChainSize &&
544 "invalid bucket for chain commoning!\n");
545 SmallPtrSet<Value *, 16> DeletedPtrs;
547 BasicBlock *LoopPredecessor =
L->getLoopPredecessor();
549 SCEVExpander SCEVE(*SE,
"loopprepare-chaincommon");
551 for (
unsigned ChainIdx = 0; ChainIdx < Bucket.ChainBases.size(); ++ChainIdx) {
552 unsigned BaseElemIdx = Bucket.ChainSize * ChainIdx;
553 const SCEV *BaseSCEV =
555 Bucket.Elements[BaseElemIdx].Offset)
561 if (!SCEVE.isSafeToExpand(BasePtrSCEV->
getStart()))
565 "Invalid SCEV type for the base ptr for a candidate chain!\n");
567 std::pair<Instruction *, Instruction *>
Base = rewriteForBase(
568 L, BasePtrSCEV, Bucket.Elements[BaseElemIdx].Instr,
569 false , ChainCommoning, SCEVE, DeletedPtrs);
576 SmallPtrSet<Value *, 16> NewPtrs;
579 for (
unsigned Idx = BaseElemIdx + 1; Idx < BaseElemIdx + Bucket.ChainSize;
581 BucketElement &
I = Bucket.Elements[Idx];
583 assert(Ptr &&
"No pointer operand");
584 if (NewPtrs.
count(Ptr))
587 const SCEV *OffsetSCEV =
588 BaseElemIdx ? SE->
getMinusSCEV(Bucket.Elements[Idx].Offset,
589 Bucket.Elements[BaseElemIdx].Offset)
590 : Bucket.Elements[Idx].Offset;
595 if (!SCEVE.isSafeToExpand(OffsetSCEV))
598 Value *OffsetValue = SCEVE.expandCodeFor(
601 Instruction *NewPtr = rewriteForBucketElement(
Base, Bucket.Elements[Idx],
602 OffsetValue, DeletedPtrs);
604 assert(NewPtr &&
"Wrong rewrite!\n");
608 ++ChainCommoningRewritten;
615 for (
auto *Ptr : DeletedPtrs) {
617 BBChanged.
insert(IDel->getParent());
637std::pair<Instruction *, Instruction *>
638PPCLoopInstrFormPrep::rewriteForBase(
Loop *L,
const SCEVAddRecExpr *BasePtrSCEV,
639 Instruction *BaseMemI,
bool CanPreInc,
640 PrepForm Form, SCEVExpander &SCEVE,
641 SmallPtrSet<Value *, 16> &DeletedPtrs) {
643 LLVM_DEBUG(
dbgs() <<
"PIP: Transforming: " << *BasePtrSCEV <<
"\n");
645 assert(BasePtrSCEV->
getLoop() == L &&
"AddRec for the wrong loop?");
648 assert(BasePtr &&
"No pointer operand");
650 Type *I8Ty = Type::getInt8Ty(BaseMemI->
getParent()->getContext());
652 PointerType::get(BaseMemI->
getParent()->getContext(),
653 BasePtr->getType()->getPointerAddressSpace());
655 bool IsConstantInc =
false;
657 Value *IncNode = getNodeForInc(L, BaseMemI, BasePtrIncSCEV);
659 const SCEVConstant *BasePtrIncConstantSCEV =
661 if (BasePtrIncConstantSCEV)
662 IsConstantInc =
true;
666 LLVM_DEBUG(
dbgs() <<
"Loop Increasement can not be represented!\n");
667 return std::make_pair(
nullptr,
nullptr);
673 <<
"Update form prepare for non-const increment is not enabled!\n");
674 return std::make_pair(
nullptr,
nullptr);
677 const SCEV *BasePtrStartSCEV =
nullptr;
680 "Increment is not loop invariant!\n");
682 IsConstantInc ? BasePtrIncConstantSCEV
685 BasePtrStartSCEV = BasePtrSCEV->
getStart();
687 if (alreadyPrepared(L, BaseMemI, BasePtrStartSCEV, BasePtrIncSCEV, Form)) {
689 return std::make_pair(
nullptr,
nullptr);
692 LLVM_DEBUG(
dbgs() <<
"PIP: New start is: " << *BasePtrStartSCEV <<
"\n");
695 unsigned HeaderLoopPredCount =
pred_size(Header);
696 BasicBlock *LoopPredecessor =
L->getLoopPredecessor();
708 if (PI != LoopPredecessor)
711 NewPHI->
addIncoming(BasePtrStart, LoopPredecessor);
723 if (PI == LoopPredecessor)
730 new BitCastInst(PtrInc,
BasePtr->getType(),
738 if (PI == LoopPredecessor)
754 NewBasePtr =
new BitCastInst(NewPHI,
BasePtr->getType(),
756 Header->getFirstInsertionPt());
761 BasePtr->replaceAllUsesWith(NewBasePtr);
763 DeletedPtrs.
insert(BasePtr);
765 return std::make_pair(NewBasePtr, PtrInc);
768Instruction *PPCLoopInstrFormPrep::rewriteForBucketElement(
769 std::pair<Instruction *, Instruction *>
Base,
const BucketElement &Element,
770 Value *OffToBase, SmallPtrSet<Value *, 16> &DeletedPtrs) {
773 assert((NewBasePtr && PtrInc) &&
"base does not exist!\n");
775 Type *I8Ty = Type::getInt8Ty(PtrInc->
getParent()->getContext());
778 assert(Ptr &&
"No pointer operand");
781 if (!Element.Offset ||
784 RealNewPtr = NewBasePtr;
786 std::optional<BasicBlock::iterator> PtrIP = std::nullopt;
788 PtrIP =
I->getIterator();
792 PtrIP = std::nullopt;
794 PtrIP = (*PtrIP)->getParent()->getFirstInsertionPt();
798 assert(OffToBase &&
"There should be an offset for non base element!\n");
800 I8Ty, PtrInc, OffToBase,
812 ReplNewPtr =
new BitCastInst(RealNewPtr, Ptr->
getType(),
816 ReplNewPtr = RealNewPtr;
824void PPCLoopInstrFormPrep::addOneCandidate(
826 std::function<
bool(
const SCEV *)> isValidDiff,
unsigned MaxCandidateNum) {
828 "Candidate should be a memory instruction.");
829 assert(LSCEV &&
"Invalid SCEV for Ptr value.");
831 bool FoundBucket =
false;
832 for (
auto &
B : Buckets) {
837 if (isValidDiff(Diff)) {
838 B.Elements.push_back(BucketElement(Diff, MemI));
845 if (Buckets.size() == MaxCandidateNum) {
846 LLVM_DEBUG(
dbgs() <<
"Can not prepare more chains, reach maximum limit "
847 << MaxCandidateNum <<
"\n");
850 Buckets.push_back(Bucket(LSCEV, MemI));
856 std::function<
bool(
const Instruction *,
Value *,
const Type *)>
858 std::function<
bool(
const SCEV *)> isValidDiff,
unsigned MaxCandidateNum) {
861 for (
const auto &BB :
L->blocks())
862 for (
auto &J : *BB) {
863 Value *PtrValue =
nullptr;
864 Type *PointerElementType =
nullptr;
873 if (
L->isLoopInvariant(PtrValue))
878 if (!LARSCEV || LARSCEV->
getLoop() != L)
882 HasCandidateForPrepare =
true;
884 if (isValidCandidate(&J, PtrValue, PointerElementType))
885 addOneCandidate(&J, LSCEV, Buckets, isValidDiff, MaxCandidateNum);
890bool PPCLoopInstrFormPrep::prepareBaseForDispFormChain(Bucket &BucketChain,
898 DenseMap<unsigned, std::pair<unsigned, unsigned>> RemainderOffsetInfo;
900 for (
unsigned j = 0, je = BucketChain.Elements.size(); j != je; ++j) {
901 if (!BucketChain.Elements[j].Offset)
902 RemainderOffsetInfo[0] = std::make_pair(0, 1);
907 if (!RemainderOffsetInfo.
contains(Remainder))
908 RemainderOffsetInfo[Remainder] = std::make_pair(j, 1);
910 RemainderOffsetInfo[Remainder].second++;
928 unsigned MaxCountRemainder = 0;
929 for (
unsigned j = 0;
j < (unsigned)
Form;
j++)
930 if (
auto It = RemainderOffsetInfo.
find(j);
931 It != RemainderOffsetInfo.
end() &&
932 It->second.second > RemainderOffsetInfo[MaxCountRemainder].second)
933 MaxCountRemainder =
j;
941 if (MaxCountRemainder == 0)
946 BucketChain.Elements[RemainderOffsetInfo[MaxCountRemainder].first].Offset;
948 for (
auto &
E : BucketChain.Elements) {
955 std::swap(BucketChain.Elements[RemainderOffsetInfo[MaxCountRemainder].first],
956 BucketChain.Elements[0]);
966bool PPCLoopInstrFormPrep::prepareBaseForUpdateFormChain(Bucket &BucketChain) {
976 for (
int j = 0, je = BucketChain.Elements.size(); j != je; ++j) {
978 if (
II->getIntrinsicID() == Intrinsic::prefetch)
987 if (!BucketChain.Elements[j].Offset ||
991 const SCEV *
Offset = BucketChain.Elements[
j].Offset;
993 for (
auto &
E : BucketChain.Elements) {
1000 std::swap(BucketChain.Elements[j], BucketChain.Elements[0]);
1006bool PPCLoopInstrFormPrep::rewriteLoadStores(
1007 Loop *L, Bucket &BucketChain, SmallPtrSet<BasicBlock *, 16> &BBChanged,
1009 bool MadeChange =
false;
1011 const SCEVAddRecExpr *BasePtrSCEV =
1016 SCEVExpander SCEVE(*SE,
"loopprepare-formrewrite");
1020 SmallPtrSet<Value *, 16> DeletedPtrs;
1025 bool CanPreInc = (
Form == UpdateForm ||
1026 ((
Form == DSForm) &&
1033 std::pair<Instruction *, Instruction *>
Base =
1034 rewriteForBase(L, BasePtrSCEV, BucketChain.Elements.begin()->Instr,
1035 CanPreInc, Form, SCEVE, DeletedPtrs);
1042 SmallPtrSet<Value *, 16> NewPtrs;
1047 assert(Ptr &&
"No pointer operand");
1048 if (NewPtrs.
count(Ptr))
1055 assert(NewPtr &&
"wrong rewrite!\n");
1063 for (
auto *Ptr : DeletedPtrs) {
1065 BBChanged.
insert(IDel->getParent());
1073 if (Form == DSForm && !CanPreInc)
1074 DSFormChainRewritten++;
1075 else if (Form == DQForm)
1076 DQFormChainRewritten++;
1077 else if (Form == UpdateForm || (Form == DSForm && CanPreInc))
1078 UpdFormChainRewritten++;
1083bool PPCLoopInstrFormPrep::updateFormPrep(
Loop *L,
1085 bool MadeChange =
false;
1086 if (Buckets.
empty())
1088 SmallPtrSet<BasicBlock *, 16> BBChanged;
1089 for (
auto &Bucket : Buckets)
1092 if (prepareBaseForUpdateFormChain(Bucket))
1093 MadeChange |= rewriteLoadStores(L, Bucket, BBChanged, UpdateForm);
1096 for (
auto *BB : BBChanged)
1101bool PPCLoopInstrFormPrep::dispFormPrep(
Loop *L,
1104 bool MadeChange =
false;
1106 if (Buckets.
empty())
1109 SmallPtrSet<BasicBlock *, 16> BBChanged;
1110 for (
auto &Bucket : Buckets) {
1113 if (prepareBaseForDispFormChain(Bucket, Form))
1114 MadeChange |= rewriteLoadStores(L, Bucket, BBChanged, Form);
1118 for (
auto *BB : BBChanged)
1131Value *PPCLoopInstrFormPrep::getNodeForInc(
Loop *L, Instruction *MemI,
1132 const SCEV *BasePtrIncSCEV) {
1153 for (
auto &CurrentPHI : PHIIter) {
1155 if (!CurrentPHINode)
1164 if (!PHIBasePtrSCEV)
1169 if (!PHIBasePtrIncSCEV || (PHIBasePtrIncSCEV != BasePtrIncSCEV))
1178 Value *StrippedBaseI =
I;
1180 StrippedBaseI = BC->getOperand(0);
1188 if (StrippedI->
getOpcode() == Instruction::Add ||
1189 (StrippedI->
getOpcode() == Instruction::GetElementPtr &&
1205bool PPCLoopInstrFormPrep::alreadyPrepared(
Loop *L, Instruction *MemI,
1206 const SCEV *BasePtrStartSCEV,
1207 const SCEV *BasePtrIncSCEV,
1216 if (!PredBB || !LatchBB)
1221 for (
auto & CurrentPHI : PHIIter) {
1223 if (!CurrentPHINode)
1232 if (!PHIBasePtrSCEV)
1235 const SCEVConstant *PHIBasePtrIncSCEV =
1237 if (!PHIBasePtrIncSCEV)
1245 if (PHIBasePtrIncSCEV == BasePtrIncSCEV) {
1248 if ((Form == UpdateForm || Form == ChainCommoning ) &&
1249 PHIBasePtrSCEV->
getStart() == BasePtrStartSCEV) {
1250 ++PHINodeAlreadyExistsUpdate;
1253 if (Form == DSForm || Form == DQForm) {
1258 ++PHINodeAlreadyExistsDS;
1260 ++PHINodeAlreadyExistsDQ;
1271bool PPCLoopInstrFormPrep::runOnLoop(
Loop *L) {
1272 bool MadeChange =
false;
1275 if (!
L->isInnermost())
1284 BasicBlock *LoopPredecessor =
L->getLoopPredecessor();
1288 if (!LoopPredecessor ||
1291 if (LoopPredecessor)
1294 if (!LoopPredecessor) {
1295 LLVM_DEBUG(
dbgs() <<
"PIP fails since no predecessor for current loop.\n");
1301 const Type *PointerElementType) {
1302 assert((PtrValue &&
I) &&
"Invalid parameter!");
1304 if (ST &&
ST->hasAltivec() && PointerElementType->
isVectorTy())
1308 if (
II && ((
II->getIntrinsicID() == Intrinsic::ppc_vsx_lxvp) ||
1309 II->getIntrinsicID() == Intrinsic::ppc_vsx_stxvp))
1319 if (!LARSCEV || LARSCEV->
getLoop() != L)
1321 if (
const SCEVConstant *StepConst =
1323 const APInt &ConstInt = StepConst->getValue()->getValue();
1333 const Type *PointerElementType) {
1334 assert((PtrValue &&
I) &&
"Invalid parameter!");
1342 [](
const User *U) { return isa<SExtInst>(U); }));
1347 const Type *PointerElementType) {
1348 assert((PtrValue &&
I) &&
"Invalid parameter!");
1352 return II->getIntrinsicID() == Intrinsic::ppc_vsx_lxvp ||
1353 II->getIntrinsicID() == Intrinsic::ppc_vsx_stxvp;
1355 return ST &&
ST->hasP9Vector() && (PointerElementType->
isVectorTy());
1362 const Type *PointerElementType) {
1363 const SCEVAddRecExpr *ARSCEV =
1385 bool SawPointer =
false;
1387 if (
Op->getType()->isPointerTy()) {
1391 }
else if (!
Op->getType()->isIntegerTy())
1400 auto isValidConstantDiff = [](
const SCEV *Diff) {
1406 auto isValidChainCommoningDiff = [](
const SCEV *Diff) {
1407 assert(Diff &&
"Invalid Diff!\n");
1422 if (!
Op->getType()->isIntegerTy())
1428 HasCandidateForPrepare =
false;
1437 if (!UpdateFormBuckets.
empty())
1438 MadeChange |= updateFormPrep(L, UpdateFormBuckets);
1439 else if (!HasCandidateForPrepare) {
1442 <<
"No prepare candidates found, stop praparation for current loop!\n");
1454 if (!DSFormBuckets.
empty())
1455 MadeChange |= dispFormPrep(L, DSFormBuckets, DSForm);
1464 if (!DQFormBuckets.
empty())
1465 MadeChange |= dispFormPrep(L, DQFormBuckets, DQForm);
1477 collectCandidates(L, isChainCommoningCandidate, isValidChainCommoningDiff,
1481 if (!Buckets.
empty())
1482 MadeChange |= chainCommoning(L, Buckets);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static const Function * getParent(const Value *V)
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file builds on the ADT/GraphTraits.h file to build generic depth first graph iterator.
static bool runOnFunction(Function &F, bool PostInlining)
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
uint64_t IntrinsicInst * II
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
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)
LLVM_ABI APInt urem(const APInt &RHS) const
Unsigned remainder operation.
bool isSignedIntN(unsigned N) const
Check if this APInt has an N-bits signed integer value.
LLVM_ABI APInt srem(const APInt &RHS) const
Function for signed remainder operation.
AnalysisUsage & addRequired()
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
InstListType::iterator iterator
Instruction iterators...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
This class represents a no-op cast from one type to another.
iterator find(const_arg_type_t< KeyT > Val)
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
FunctionPass class - This class is used to implement most global optimizations.
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
LLVM_ABI void setIsInBounds(bool b=true)
Set or clear the inbounds flag on this GEP instruction.
Module * getParent()
Get the module that this global value is contained inside of...
LLVM_ABI void insertBefore(InstListType::iterator InsertPos)
Insert an unlinked instruction into a basic block immediately before the specified position.
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
LLVM_ABI void insertAfter(Instruction *InsertPos)
Insert an unlinked instruction into a basic block immediately after the specified instruction.
A wrapper class for inspecting calls to intrinsic functions.
An instruction for reading from memory.
The legacy pass manager's analysis pass to compute loop information.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
Value * getIncomingValueForBlock(const BasicBlock *BB) const
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
int getBasicBlockIndex(const BasicBlock *BB) const
Return the first index of the specified basic block in the value list for this PHI.
unsigned getNumIncomingValues() const
Return the number of incoming edges.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
Common code between 32-bit and 64-bit PowerPC targets.
const PPCSubtarget * getSubtargetImpl(const Function &F) const override
Virtual method implemented by subclasses that returns a reference to that target's TargetSubtargetInf...
bool isAffine() const
Return true if this represents an expression A + B*x where A and B are loop invariant values.
const Loop * getLoop() const
SCEVUse getStepRecurrence(ScalarEvolution &SE) const
Constructs and returns the recurrence indicating how much this expression steps by.
const APInt & getAPInt() const
LLVM_ABI bool isSafeToExpand(const SCEV *S) const
Return true if the given expression is safe to expand in the sense that all materialized values are s...
void clear()
Erase the contents of the InsertedExpressions map so that users trying to expand the same expression ...
LLVM_ABI Value * expandCodeFor(SCEVUse SH, Type *Ty, BasicBlock::iterator I)
Insert code to directly compute the specified SCEV expression into the program.
ArrayRef< SCEVUse > operands() const
This class represents an analyzed expression in the program.
Type * getType() const
Return the LLVM type of this SCEV expression.
LLVM_ABI const SCEV * getNegativeSCEV(const SCEV *V, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap)
Return the SCEV object corresponding to -V.
LLVM_ABI SCEVUse getSCEVAtScope(const SCEV *S, const Loop *L)
Return a SCEV expression for the specified value at the specified scope in the program.
LLVM_ABI const SCEV * getMinusSCEV(SCEVUse LHS, SCEVUse RHS, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Return LHS-RHS.
LLVM_ABI bool isLoopInvariant(const SCEV *S, const Loop *L)
Return true if the value of the given SCEV is unchanging in the specified loop.
LLVM_ABI bool isSCEVable(Type *Ty) const
Test if values of the given type are analyzable within the SCEV framework.
LLVM_ABI SCEVUse getAddExpr(SmallVectorImpl< SCEVUse > &Ops, SCEVFlags Flags={}, unsigned Depth=0)
Get a canonical add expression, or something simpler if possible.
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.
An instruction for storing to memory.
Represent a constant reference to a string, i.e.
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 isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
bool isIntegerTy() const
True if this is an instance of IntegerType.
bool isVoidTy() const
Return true if this is 'void'.
Value * getOperand(unsigned i) const
unsigned getNumOperands() const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
LLVMContext & getContext() const
All values hold a context through their type.
const ParentTy * getParent() const
self_iterator getIterator()
@ BasicBlock
Various leaf nodes.
initializer< Ty > init(const Ty &Val)
friend class Instruction
Iterator for Instructions in a `BasicBlock.
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
LLVM_ABI BasicBlock * InsertPreheaderForLoop(Loop *L, DominatorTree *DT, LoopInfo *LI, MemorySSAUpdater *MSSAU, bool PreserveLCSSA)
InsertPreheaderForLoop - Once we discover that a loop doesn't have a preheader, this method is called...
LLVM_ABI 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.
FunctionPass * createPPCLoopInstrFormPrepPass(PPCTargetMachine &TM)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI bool DeleteDeadPHIs(BasicBlock *BB, const TargetLibraryInfo *TLI=nullptr, MemorySSAUpdater *MSSAU=nullptr, SmallPtrSetImpl< PHINode * > *KnownNonDeadPHIs=nullptr)
Examine each PHI in the given block and delete it if it is dead.
auto pred_size(const MachineBasicBlock *BB)
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
iterator_range(Container &&) -> iterator_range< llvm::detail::IterOfRange< Container > >
DWARFExpression::Operation Op
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
auto predecessors(const MachineBasicBlock *BB)
iterator_range< df_iterator< T > > depth_first(const T &G)
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
SCEVPtrT getPointer() const