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 {
185 BucketElement(Instruction *
I) : Offset(nullptr), Instr(
I) {}
192 Bucket(
const SCEV *
B, Instruction *
I)
193 : BaseSCEV(
B), Elements(1, BucketElement(
I)) {
198 const SCEV *BaseSCEV;
216 enum PrepForm { UpdateForm = 1, DSForm = 4, DQForm = 16, ChainCommoning };
222 PPCLoopInstrFormPrep(PPCTargetMachine &TM) : FunctionPass(ID), TM(&TM) {}
224 void getAnalysisUsage(AnalysisUsage &AU)
const override {
234 PPCTargetMachine *TM =
nullptr;
235 const PPCSubtarget *ST;
240 bool HasCandidateForPrepare;
246 unsigned SuccPrepCount;
248 bool runOnLoop(Loop *L);
251 bool alreadyPrepared(Loop *L, Instruction *MemI,
252 const SCEV *BasePtrStartSCEV,
253 const SCEV *BasePtrIncSCEV, PrepForm Form);
256 Value *getNodeForInc(Loop *L, Instruction *MemI,
257 const SCEV *BasePtrIncSCEV);
263 bool prepareBasesForCommoningChains(Bucket &BucketChain);
266 bool rewriteLoadStoresForCommoningChains(
267 Loop *L, Bucket &Bucket, SmallPtrSet<BasicBlock *, 16> &BBChanged);
273 std::function<
bool(
const Instruction *,
Value *,
const Type *)>
275 std::function<
bool(
const SCEV *)> isValidDiff,
276 unsigned MaxCandidateNum);
280 void addOneCandidate(Instruction *MemI,
const SCEV *LSCEV,
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,
310 SmallPtrSet<BasicBlock *, 16> &BBChanged,
314 std::pair<Instruction *, Instruction *>
315 rewriteForBase(Loop *L,
const SCEVAddRecExpr *BasePtrSCEV,
316 Instruction *BaseMemI,
bool CanPreInc, PrepForm Form,
317 SCEVExpander &SCEVE, SmallPtrSet<Value *, 16> &DeletedPtrs);
322 rewriteForBucketElement(std::pair<Instruction *, Instruction *>
Base,
323 const BucketElement &Element,
Value *OffToBase,
324 SmallPtrSet<Value *, 16> &DeletedPtrs);
329char PPCLoopInstrFormPrep::ID = 0;
330static const char *
name =
"Prepare loop for ppc preferred instruction forms";
342 return new PPCLoopInstrFormPrep(TM);
346 Value *StrippedBasePtr = BasePtr;
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;
370 PtrValue = LMemI->getPointerOperand();
371 PointerElementType = LMemI->getType();
373 PtrValue = SMemI->getPointerOperand();
374 PointerElementType = SMemI->getValueOperand()->getType();
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;
524 SmallPtrSet<BasicBlock *, 16> BBChanged;
526 for (
auto &Bucket : Buckets) {
527 if (prepareBasesForCommoningChains(Bucket))
528 MadeChange |= rewriteLoadStoresForCommoningChains(L, Bucket, BBChanged);
532 for (
auto *BB : BBChanged)
537bool PPCLoopInstrFormPrep::rewriteLoadStoresForCommoningChains(
538 Loop *L, Bucket &Bucket, SmallPtrSet<BasicBlock *, 16> &BBChanged) {
539 bool MadeChange =
false;
541 assert(Bucket.Elements.size() ==
542 Bucket.ChainBases.size() * Bucket.ChainSize &&
543 "invalid bucket for chain commoning!\n");
544 SmallPtrSet<Value *, 16> DeletedPtrs;
547 BasicBlock *LoopPredecessor =
L->getLoopPredecessor();
549 SCEVExpander SCEVE(*SE, Header->getDataLayout(),
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)
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];
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());
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,
811 if (
Ptr->getType() != RealNewPtr->
getType()) {
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 =
1017 SCEVExpander SCEVE(*SE, Header->getDataLayout(),
1018 "loopprepare-formrewrite");
1022 SmallPtrSet<Value *, 16> DeletedPtrs;
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);
1044 SmallPtrSet<Value *, 16> NewPtrs;
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())
1090 SmallPtrSet<BasicBlock *, 16> BBChanged;
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())
1111 SmallPtrSet<BasicBlock *, 16> BBChanged;
1112 for (
auto &Bucket : Buckets) {
1115 if (prepareBaseForDispFormChain(Bucket, Form))
1116 MadeChange |= rewriteLoadStores(L, Bucket, BBChanged, Form);
1120 for (
auto *BB : BBChanged)
1133Value *PPCLoopInstrFormPrep::getNodeForInc(Loop *L, Instruction *MemI,
1134 const SCEV *BasePtrIncSCEV) {
1155 for (
auto &CurrentPHI : PHIIter) {
1157 if (!CurrentPHINode)
1166 if (!PHIBasePtrSCEV)
1171 if (!PHIBasePtrIncSCEV || (PHIBasePtrIncSCEV != BasePtrIncSCEV))
1180 Value *StrippedBaseI =
I;
1182 StrippedBaseI = BC->getOperand(0);
1190 if (StrippedI->
getOpcode() == Instruction::Add ||
1191 (StrippedI->
getOpcode() == Instruction::GetElementPtr &&
1207bool PPCLoopInstrFormPrep::alreadyPrepared(Loop *L, Instruction *MemI,
1208 const SCEV *BasePtrStartSCEV,
1209 const SCEV *BasePtrIncSCEV,
1218 if (!PredBB || !LatchBB)
1223 for (
auto & CurrentPHI : PHIIter) {
1225 if (!CurrentPHINode)
1234 if (!PHIBasePtrSCEV)
1237 const SCEVConstant *PHIBasePtrIncSCEV =
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())
1310 if (
II && ((
II->getIntrinsicID() == Intrinsic::ppc_vsx_lxvp) ||
1311 II->getIntrinsicID() == Intrinsic::ppc_vsx_stxvp))
1321 if (!LARSCEV || LARSCEV->
getLoop() != L)
1323 if (
const SCEVConstant *StepConst =
1325 const APInt &ConstInt = StepConst->getValue()->getValue();
1335 const Type *PointerElementType) {
1336 assert((PtrValue &&
I) &&
"Invalid parameter!");
1344 [](
const User *U) { return isa<SExtInst>(U); }));
1349 const Type *PointerElementType) {
1350 assert((PtrValue &&
I) &&
"Invalid parameter!");
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) {
1365 const SCEVAddRecExpr *ARSCEV =
1387 bool SawPointer =
false;
1389 if (
Op->getType()->isPointerTy()) {
1393 }
else if (!
Op->getType()->isIntegerTy())
1402 auto isValidConstantDiff = [](
const SCEV *Diff) {
1408 auto isValidChainCommoningDiff = [](
const SCEV *Diff) {
1409 assert(Diff &&
"Invalid Diff!\n");
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< 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 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.
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 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
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(const SCEV *SH, Type *Ty, BasicBlock::iterator I)
Insert code to directly compute the specified SCEV expression into the program.
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.
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.
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.
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.
LLVM_ABI 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.
FunctionAddr VTableAddr Value
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.
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.
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.