94#include "llvm/IR/IntrinsicsPowerPC.h"
111#define DEBUG_TYPE "ppc-loop-instr-form-prep"
117 cl::desc(
"Potential common base number threshold per function "
118 "for PPC loop prep"));
122 cl::desc(
"prefer update form when ds form is also a update form"));
126 cl::desc(
"prepare update form when the load/store increment is a loop "
127 "invariant non-const value."));
131 cl::desc(
"Enable chain commoning in PPC loop prepare pass."));
138 cl::desc(
"Potential PHI threshold per loop for PPC loop prep of update "
143 cl::desc(
"Potential PHI threshold per loop for PPC loop prep of DS form"));
147 cl::desc(
"Potential PHI threshold per loop for PPC loop prep of DQ form"));
158 cl::desc(
"Bucket number per loop for PPC loop chain common"));
166 cl::desc(
"Minimal common base load/store instructions triggering DS/DQ form "
171 cl::desc(
"Minimal common base load/store instructions triggering chain "
172 "commoning preparation. Must be not smaller than 4"));
174STATISTIC(PHINodeAlreadyExistsUpdate,
"PHI node already in pre-increment form");
175STATISTIC(PHINodeAlreadyExistsDS,
"PHI node already in DS form");
176STATISTIC(PHINodeAlreadyExistsDQ,
"PHI node already in DQ form");
177STATISTIC(DSFormChainRewritten,
"Num of DS form chain rewritten");
178STATISTIC(DQFormChainRewritten,
"Num of DQ form chain rewritten");
179STATISTIC(UpdFormChainRewritten,
"Num of update form chain rewritten");
180STATISTIC(ChainCommoningRewritten,
"Num of commoning chains");
183 struct BucketElement {
193 : BaseSCEV(
B),
Elements(1, BucketElement(
I)) {
198 const SCEV *BaseSCEV;
216 enum PrepForm { UpdateForm = 1, DSForm = 4, DQForm = 16, ChainCommoning };
240 bool HasCandidateForPrepare;
246 unsigned SuccPrepCount;
248 bool runOnLoop(
Loop *L);
252 const SCEV *BasePtrStartSCEV,
253 const SCEV *BasePtrIncSCEV, PrepForm Form);
257 const SCEV *BasePtrIncSCEV);
263 bool prepareBasesForCommoningChains(Bucket &BucketChain);
266 bool rewriteLoadStoresForCommoningChains(
275 std::function<
bool(
const SCEV *)> isValidDiff,
276 unsigned MaxCandidateNum);
282 std::function<
bool(
const SCEV *)> isValidDiff,
283 unsigned MaxCandidateNum);
298 bool prepareBaseForDispFormChain(Bucket &BucketChain, PrepForm Form);
305 bool prepareBaseForUpdateFormChain(Bucket &BucketChain);
309 bool rewriteLoadStores(
Loop *L, Bucket &BucketChain,
314 std::pair<Instruction *, Instruction *>
316 Instruction *BaseMemI,
bool CanPreInc, PrepForm Form,
322 rewriteForBucketElement(std::pair<Instruction *, Instruction *>
Base,
323 const BucketElement &Element,
Value *OffToBase,
329char PPCLoopInstrFormPrep::ID = 0;
330static const char *
name =
"Prepare loop for ppc preferred instruction forms";
342 return new PPCLoopInstrFormPrep(TM);
346 Value *StrippedBasePtr = BasePtr;
347 while (
BitCastInst *BC = dyn_cast<BitCastInst>(StrippedBasePtr))
348 StrippedBasePtr = BC->getOperand(0);
350 return GEP->isInBounds();
356 assert(
I &&
"Invalid paramater!");
358 return (
I->getName() + Suffix).str();
364 Type **PtrElementType =
nullptr) {
366 Value *PtrValue =
nullptr;
367 Type *PointerElementType =
nullptr;
369 if (
LoadInst *LMemI = dyn_cast<LoadInst>(MemI)) {
370 PtrValue = LMemI->getPointerOperand();
371 PointerElementType = LMemI->getType();
372 }
else if (
StoreInst *SMemI = dyn_cast<StoreInst>(MemI)) {
373 PtrValue = SMemI->getPointerOperand();
374 PointerElementType = SMemI->getValueOperand()->getType();
375 }
else if (
IntrinsicInst *IMemI = dyn_cast<IntrinsicInst>(MemI)) {
377 if (IMemI->getIntrinsicID() == Intrinsic::prefetch ||
378 IMemI->getIntrinsicID() == Intrinsic::ppc_vsx_lxvp) {
379 PtrValue = IMemI->getArgOperand(0);
380 }
else if (IMemI->getIntrinsicID() == Intrinsic::ppc_vsx_stxvp) {
381 PtrValue = IMemI->getArgOperand(1);
386 *PtrElementType = PointerElementType;
391bool PPCLoopInstrFormPrep::runOnFunction(
Function &
F) {
395 LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
396 SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
397 auto *DTWP = getAnalysisIfAvailable<DominatorTreeWrapperPass>();
398 DT = DTWP ? &DTWP->getDomTree() :
nullptr;
399 PreserveLCSSA = mustPreserveAnalysisID(
LCSSAID);
400 ST =
TM ?
TM->getSubtargetImpl(
F) :
nullptr;
403 bool MadeChange =
false;
407 MadeChange |= runOnLoop(L);
418bool PPCLoopInstrFormPrep::prepareBasesForCommoningChains(Bucket &CBucket) {
435 "Thredhold can not be smaller than 4!\n");
441 const SCEV *FirstOffset = CBucket.Elements[1].Offset;
446 unsigned FirstOffsetReusedCount = 1;
450 unsigned FirstOffsetReusedCountInFirstChain = 1;
452 unsigned EleNum = CBucket.Elements.size();
453 bool SawChainSeparater =
false;
454 for (
unsigned j = 2;
j != EleNum; ++
j) {
456 CBucket.Elements[j - 1].Offset) == FirstOffset) {
457 if (!SawChainSeparater)
458 FirstOffsetReusedCountInFirstChain++;
459 FirstOffsetReusedCount++;
477 SawChainSeparater =
true;
481 if (FirstOffsetReusedCount == 1)
485 FirstOffsetReusedCount / FirstOffsetReusedCountInFirstChain;
489 if (!SawChainSeparater)
490 ChainNum = (
unsigned)sqrt((
double)EleNum);
492 CBucket.ChainSize = (
unsigned)(EleNum / ChainNum);
496 if (CBucket.ChainSize * ChainNum != EleNum)
499 if (SawChainSeparater) {
501 for (
unsigned i = 1; i < CBucket.ChainSize; i++)
502 for (
unsigned j = 1;
j < ChainNum;
j++)
503 if (CBucket.Elements[i].Offset !=
504 SE->
getMinusSCEV(CBucket.Elements[i + j * CBucket.ChainSize].Offset,
505 CBucket.Elements[j * CBucket.ChainSize].Offset))
509 for (
unsigned i = 0; i < ChainNum; i++)
510 CBucket.ChainBases.push_back(CBucket.Elements[i * CBucket.ChainSize]);
517bool PPCLoopInstrFormPrep::chainCommoning(
Loop *L,
519 bool MadeChange =
false;
526 for (
auto &Bucket : Buckets) {
527 if (prepareBasesForCommoningChains(Bucket))
528 MadeChange |= rewriteLoadStoresForCommoningChains(L, Bucket, BBChanged);
532 for (
auto *BB : BBChanged)
537bool PPCLoopInstrFormPrep::rewriteLoadStoresForCommoningChains(
539 bool MadeChange =
false;
541 assert(Bucket.Elements.size() ==
542 Bucket.ChainBases.size() * Bucket.ChainSize &&
543 "invalid bucket for chain commoning!\n");
547 BasicBlock *LoopPredecessor =
L->getLoopPredecessor();
550 "loopprepare-chaincommon");
552 for (
unsigned ChainIdx = 0; ChainIdx < Bucket.ChainBases.size(); ++ChainIdx) {
553 unsigned BaseElemIdx = Bucket.ChainSize * ChainIdx;
554 const SCEV *BaseSCEV =
556 Bucket.Elements[BaseElemIdx].Offset)
558 const SCEVAddRecExpr *BasePtrSCEV = cast<SCEVAddRecExpr>(BaseSCEV);
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);
579 for (
unsigned Idx = BaseElemIdx + 1;
Idx < BaseElemIdx + Bucket.ChainSize;
581 BucketElement &
I = Bucket.Elements[
Idx];
587 const SCEV *OffsetSCEV =
589 Bucket.Elements[BaseElemIdx].Offset)
590 : Bucket.Elements[
Idx].Offset;
595 if (!SCEVE.isSafeToExpand(OffsetSCEV))
598 Value *OffsetValue = SCEVE.expandCodeFor(
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 *>
643 LLVM_DEBUG(
dbgs() <<
"PIP: Transforming: " << *BasePtrSCEV <<
"\n");
645 assert(BasePtrSCEV->
getLoop() == L &&
"AddRec for the wrong loop?");
648 assert(BasePtr &&
"No pointer operand");
652 PointerType::get(BaseMemI->
getParent()->getContext(),
653 BasePtr->getType()->getPointerAddressSpace());
655 bool IsConstantInc =
false;
657 Value *IncNode = getNodeForInc(L, BaseMemI, BasePtrIncSCEV);
660 dyn_cast<SCEVConstant>(BasePtrIncSCEV);
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);
721 cast<GetElementPtrInst>(PtrInc)->setIsInBounds(
IsPtrInBounds(BasePtr));
723 if (PI == LoopPredecessor)
738 if (PI == LoopPredecessor)
748 cast<GetElementPtrInst>(PtrInc)->setIsInBounds(
IsPtrInBounds(BasePtr));
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,
773 assert((NewBasePtr && PtrInc) &&
"base does not exist!\n");
781 if (!Element.Offset ||
782 (isa<SCEVConstant>(Element.Offset) &&
783 cast<SCEVConstant>(Element.Offset)->getValue()->isZero())) {
784 RealNewPtr = NewBasePtr;
786 std::optional<BasicBlock::iterator> PtrIP = std::nullopt;
788 PtrIP =
I->getIterator();
790 if (PtrIP && isa<Instruction>(NewBasePtr) &&
792 PtrIP = std::nullopt;
793 else if (PtrIP && isa<PHINode>(*PtrIP))
794 PtrIP = (*PtrIP)->getParent()->getFirstInsertionPt();
796 PtrIP = Element.Instr->getIterator();
798 assert(OffToBase &&
"There should be an offset for non base element!\n");
800 I8Ty, PtrInc, OffToBase,
811 if (
Ptr->getType() != RealNewPtr->
getType()) {
816 ReplNewPtr = RealNewPtr;
818 Ptr->replaceAllUsesWith(ReplNewPtr);
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) {
833 if (cast<SCEVAddRecExpr>(
B.BaseSCEV)->getStepRecurrence(*SE) !=
834 cast<SCEVAddRecExpr>(LSCEV)->getStepRecurrence(*SE))
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));
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,
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);
904 unsigned Remainder = cast<SCEVConstant>(BucketChain.Elements[j].Offset)
907 if (!RemainderOffsetInfo.
contains(Remainder))
908 RemainderOffsetInfo[Remainder] = std::make_pair(j, 1);
910 RemainderOffsetInfo[Remainder].second++;
928 unsigned MaxCountRemainder = 0;
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) {
977 if (
auto *
II = dyn_cast<IntrinsicInst>(BucketChain.Elements[j].Instr))
978 if (
II->getIntrinsicID() == Intrinsic::prefetch)
987 if (!BucketChain.Elements[j].Offset ||
988 cast<SCEVConstant>(BucketChain.Elements[j].Offset)->isZero())
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(
1009 bool MadeChange =
false;
1012 cast<SCEVAddRecExpr>(BucketChain.BaseSCEV);
1018 "loopprepare-formrewrite");
1027 bool CanPreInc = (
Form == UpdateForm ||
1028 ((
Form == DSForm) &&
1035 std::pair<Instruction *, Instruction *>
Base =
1036 rewriteForBase(L, BasePtrSCEV, BucketChain.Elements.begin()->Instr,
1037 CanPreInc, Form, SCEVE, DeletedPtrs);
1055 BE.Offset ? cast<SCEVConstant>(BE.Offset)->getValue() :
nullptr,
1057 assert(NewPtr &&
"wrong rewrite!\n");
1065 for (
auto *
Ptr : DeletedPtrs) {
1067 BBChanged.
insert(IDel->getParent());
1075 if (Form == DSForm && !CanPreInc)
1076 DSFormChainRewritten++;
1077 else if (Form == DQForm)
1078 DQFormChainRewritten++;
1079 else if (Form == UpdateForm || (Form == DSForm && CanPreInc))
1080 UpdFormChainRewritten++;
1085bool PPCLoopInstrFormPrep::updateFormPrep(
Loop *L,
1087 bool MadeChange =
false;
1088 if (Buckets.
empty())
1091 for (
auto &Bucket : Buckets)
1094 if (prepareBaseForUpdateFormChain(Bucket))
1095 MadeChange |= rewriteLoadStores(L, Bucket, BBChanged, UpdateForm);
1098 for (
auto *BB : BBChanged)
1103bool PPCLoopInstrFormPrep::dispFormPrep(
Loop *L,
1106 bool MadeChange =
false;
1108 if (Buckets.
empty())
1112 for (
auto &Bucket : Buckets) {
1115 if (prepareBaseForDispFormChain(Bucket, Form))
1116 MadeChange |= rewriteLoadStores(L, Bucket, BBChanged, Form);
1120 for (
auto *BB : BBChanged)
1134 const SCEV *BasePtrIncSCEV) {
1137 if (isa<SCEVConstant>(BasePtrIncSCEV))
1138 return cast<SCEVConstant>(BasePtrIncSCEV)->getValue();
1155 for (
auto &CurrentPHI : PHIIter) {
1156 PHINode *CurrentPHINode = dyn_cast<PHINode>(&CurrentPHI);
1157 if (!CurrentPHINode)
1165 const SCEVAddRecExpr *PHIBasePtrSCEV = dyn_cast<SCEVAddRecExpr>(PHISCEV);
1166 if (!PHIBasePtrSCEV)
1171 if (!PHIBasePtrIncSCEV || (PHIBasePtrIncSCEV != BasePtrIncSCEV))
1180 Value *StrippedBaseI =
I;
1181 while (
BitCastInst *BC = dyn_cast<BitCastInst>(StrippedBaseI))
1182 StrippedBaseI = BC->getOperand(0);
1184 Instruction *StrippedI = dyn_cast<Instruction>(StrippedBaseI);
1190 if (StrippedI->
getOpcode() == Instruction::Add ||
1191 (StrippedI->
getOpcode() == Instruction::GetElementPtr &&
1208 const SCEV *BasePtrStartSCEV,
1209 const SCEV *BasePtrIncSCEV,
1218 if (!PredBB || !LatchBB)
1223 for (
auto & CurrentPHI : PHIIter) {
1224 PHINode *CurrentPHINode = dyn_cast<PHINode>(&CurrentPHI);
1225 if (!CurrentPHINode)
1233 const SCEVAddRecExpr *PHIBasePtrSCEV = dyn_cast<SCEVAddRecExpr>(PHISCEV);
1234 if (!PHIBasePtrSCEV)
1239 if (!PHIBasePtrIncSCEV)
1247 if (PHIBasePtrIncSCEV == BasePtrIncSCEV) {
1250 if ((Form == UpdateForm || Form == ChainCommoning ) &&
1251 PHIBasePtrSCEV->
getStart() == BasePtrStartSCEV) {
1252 ++PHINodeAlreadyExistsUpdate;
1255 if (Form == DSForm || Form == DQForm) {
1260 ++PHINodeAlreadyExistsDS;
1262 ++PHINodeAlreadyExistsDQ;
1273bool PPCLoopInstrFormPrep::runOnLoop(
Loop *L) {
1274 bool MadeChange =
false;
1277 if (!
L->isInnermost())
1286 BasicBlock *LoopPredecessor =
L->getLoopPredecessor();
1290 if (!LoopPredecessor ||
1293 if (LoopPredecessor)
1296 if (!LoopPredecessor) {
1297 LLVM_DEBUG(
dbgs() <<
"PIP fails since no predecessor for current loop.\n");
1303 const Type *PointerElementType) {
1304 assert((PtrValue &&
I) &&
"Invalid parameter!");
1306 if (ST &&
ST->hasAltivec() && PointerElementType->
isVectorTy())
1309 auto *
II = dyn_cast<IntrinsicInst>(
I);
1310 if (
II && ((
II->getIntrinsicID() == Intrinsic::ppc_vsx_lxvp) ||
1311 II->getIntrinsicID() == Intrinsic::ppc_vsx_stxvp))
1321 if (!LARSCEV || LARSCEV->
getLoop() != L)
1325 const APInt &ConstInt = StepConst->getValue()->getValue();
1335 const Type *PointerElementType) {
1336 assert((PtrValue &&
I) &&
"Invalid parameter!");
1337 if (isa<IntrinsicInst>(
I))
1344 [](
const User *U) { return isa<SExtInst>(U); }));
1349 const Type *PointerElementType) {
1350 assert((PtrValue &&
I) &&
"Invalid parameter!");
1352 auto *
II = dyn_cast<IntrinsicInst>(
I);
1354 return II->getIntrinsicID() == Intrinsic::ppc_vsx_lxvp ||
1355 II->getIntrinsicID() == Intrinsic::ppc_vsx_stxvp;
1357 return ST &&
ST->hasP9Vector() && (PointerElementType->
isVectorTy());
1364 const Type *PointerElementType) {
1376 if (isa<SCEVUnknown>(Start) && Start->getType()->isPointerTy())
1379 const SCEVAddExpr *ASCEV = dyn_cast<SCEVAddExpr>(Start);
1387 bool SawPointer =
false;
1389 if (
Op->getType()->isPointerTy()) {
1393 }
else if (!
Op->getType()->isIntegerTy())
1402 auto isValidConstantDiff = [](
const SCEV *Diff) {
1403 return dyn_cast<SCEVConstant>(Diff) !=
nullptr;
1408 auto isValidChainCommoningDiff = [](
const SCEV *Diff) {
1409 assert(Diff &&
"Invalid Diff!\n");
1412 if (isa<SCEVConstant>(Diff))
1419 const SCEVNAryExpr *ADiff = dyn_cast<SCEVNAryExpr>(Diff);
1424 if (!
Op->getType()->isIntegerTy())
1430 HasCandidateForPrepare =
false;
1439 if (!UpdateFormBuckets.
empty())
1440 MadeChange |= updateFormPrep(L, UpdateFormBuckets);
1441 else if (!HasCandidateForPrepare) {
1444 <<
"No prepare candidates found, stop praparation for current loop!\n");
1456 if (!DSFormBuckets.
empty())
1457 MadeChange |= dispFormPrep(L, DSFormBuckets, DSForm);
1466 if (!DQFormBuckets.
empty())
1467 MadeChange |= dispFormPrep(L, DQFormBuckets, DQForm);
1479 collectCandidates(L, isChainCommoningCandidate, isValidChainCommoningDiff,
1483 if (!Buckets.
empty())
1484 MadeChange |= chainCommoning(L, Buckets);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static const Function * getParent(const Value *V)
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
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 builds on the ADT/GraphTraits.h file to build generic depth first graph iterator.
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)
Class for arbitrary precision integers.
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.
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
LLVM Basic Block Representation.
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 if the block is well formed or null if the block is not well forme...
This class represents a no-op cast from one type to another.
This class represents an Operation in the Expression.
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.
Legacy analysis pass which computes a DominatorTree.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
FunctionPass class - This class is used to implement most global optimizations.
virtual bool runOnFunction(Function &F)=0
runOnFunction - Virtual method overriden by subclasses to do the per-function processing of the pass.
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.
Represents a single loop in the control flow graph.
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.
virtual void getAnalysisUsage(AnalysisUsage &) const
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
This node represents an addition of some number of SCEVs.
This node represents a polynomial recurrence on the trip count of the specified loop.
const SCEV * getStart() const
const SCEV * getStepRecurrence(ScalarEvolution &SE) const
Constructs and returns the recurrence indicating how much this expression steps by.
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
This class represents a constant integer value.
const APInt & getAPInt() const
This class uses information about analyze scalars to rewrite expressions in canonical form.
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(const SCEV *SH, Type *Ty, BasicBlock::iterator I)
Insert code to directly compute the specified SCEV expression into the program.
This node is a base class providing common functionality for n'ary operators.
ArrayRef< const SCEV * > operands() const
This class represents an analyzed expression in the program.
LLVM_ABI Type * getType() const
Return the LLVM type of this SCEV expression.
The main scalar evolution driver.
LLVM_ABI const SCEV * getNegativeSCEV(const SCEV *V, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap)
Return the SCEV object corresponding to -V.
LLVM_ABI const SCEV * getSCEVAtScope(const SCEV *S, const Loop *L)
Return a SCEV expression for the specified value at the specified scope in the program.
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 const SCEV * getMinusSCEV(const SCEV *LHS, const SCEV *RHS, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Return LHS-RHS.
LLVM_ABI const SCEV * getAddExpr(SmallVectorImpl< const SCEV * > &Ops, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, 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.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
StringRef - 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.
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
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.
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 LLVMContext & getContext() const
All values hold a context through their type.
const ParentTy * getParent() const
self_iterator getIterator()
A range adaptor for a pair of iterators.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
initializer< Ty > init(const Ty &Val)
NodeAddr< InstrNode * > Instr
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)
auto pred_size(const MachineBasicBlock *BB)
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 bool DeleteDeadPHIs(BasicBlock *BB, const TargetLibraryInfo *TLI=nullptr, MemorySSAUpdater *MSSAU=nullptr)
Examine each PHI in the given block and delete it if it is dead.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
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.