81#define DEBUG_TYPE "loop-idiom-vectorize" 
   85                                cl::desc(
"Disable Loop Idiom Vectorize Pass."));
 
   89                cl::desc(
"The vectorization style for loop idiom transform."),
 
   91                                      "Use masked vector intrinsics"),
 
   93                                      "predicated", 
"Use VP intrinsics")),
 
   99                   cl::desc(
"Proceed with Loop Idiom Vectorize Pass, but do " 
  100                            "not convert byte-compare loop(s)."));
 
  104              cl::desc(
"The vectorization factor for byte-compare patterns."),
 
  110                         cl::desc(
"Do not convert find-first-byte loop(s)."));
 
  114                cl::desc(
"Verify loops generated Loop Idiom Vectorize Pass."));
 
  117class LoopIdiomVectorize {
 
  119  unsigned ByteCompareVF;
 
  120  Loop *CurLoop = 
nullptr;
 
  128  BasicBlock *VectorLoopPreheaderBlock = 
nullptr;
 
  130  BasicBlock *VectorLoopMismatchBlock = 
nullptr;
 
  137      : VectorizeStyle(S), ByteCompareVF(VF), DT(DT), LI(LI), 
TTI(
TTI), 
DL(
DL) {
 
  146  bool runOnCountableLoop();
 
  147  bool runOnLoopBlock(BasicBlock *BB, 
const SCEV *BECount,
 
  148                      SmallVectorImpl<BasicBlock *> &ExitBlocks);
 
  150  bool recognizeByteCompare();
 
  153                            GetElementPtrInst *GEPA, GetElementPtrInst *GEPB,
 
  154                            Instruction *Index, 
Value *Start, 
Value *MaxLen);
 
  157                                  GetElementPtrInst *GEPA,
 
  158                                  GetElementPtrInst *GEPB, 
Value *ExtStart,
 
  160  Value *createPredicatedFindMismatch(
IRBuilder<> &Builder, DomTreeUpdater &DTU,
 
  161                                      GetElementPtrInst *GEPA,
 
  162                                      GetElementPtrInst *GEPB, 
Value *ExtStart,
 
  165  void transformByteCompare(GetElementPtrInst *GEPA, GetElementPtrInst *GEPB,
 
  166                            PHINode *IndPhi, 
Value *MaxLen, Instruction *Index,
 
  167                            Value *Start, 
bool IncIdx, BasicBlock *FoundBB,
 
  170  bool recognizeFindFirstByte();
 
  173                             unsigned VF, 
Type *CharTy, 
Value *IndPhi,
 
  174                             BasicBlock *ExitSucc, BasicBlock *ExitFail,
 
  178  void transformFindFirstByte(PHINode *IndPhi, 
unsigned VF, 
Type *CharTy,
 
  179                              BasicBlock *ExitSucc, BasicBlock *ExitFail,
 
  192  const auto *
DL = &L.getHeader()->getDataLayout();
 
  198  unsigned BCVF = ByteCompareVF;
 
  202  LoopIdiomVectorize LIV(VecStyle, BCVF, &AR.
DT, &AR.
LI, &AR.
TTI, 
DL);
 
 
  215bool LoopIdiomVectorize::run(
Loop *L) {
 
  218  Function &
F = *L->getHeader()->getParent();
 
  222  if (
F.hasFnAttribute(Attribute::NoImplicitFloat)) {
 
  224                      << 
" due to its NoImplicitFloat attribute");
 
  230  if (!L->getLoopPreheader())
 
  234                    << CurLoop->getHeader()->getName() << 
"\n");
 
  236  if (recognizeByteCompare())
 
  239  if (recognizeFindFirstByte())
 
  251    for (
Value *
Op : PN.incoming_values())
 
  252      if (
Op == ScalarRes) {
 
  260      PN.addIncoming(VectorRes, IncBB);
 
  268        if (L->contains(BB)) {
 
  269          PN.addIncoming(PN.getIncomingValueForBlock(BB), IncBB);
 
 
  276bool LoopIdiomVectorize::recognizeByteCompare() {
 
  283  if (!
TTI->supportsScalableVectors() || !
TTI->getMinPageSize().has_value() ||
 
  291  if (CurLoop->getNumBackEdges() != 1 || CurLoop->getNumBlocks() != 2)
 
  298  auto LoopBlocks = CurLoop->getBlocks();
 
  307  if (LoopBlocks[0]->sizeWithoutDebug() > 4)
 
  321  if (LoopBlocks[1]->sizeWithoutDebug() > 7)
 
  325  Value *StartIdx = 
nullptr;
 
  336  if (!Index || !
Index->getType()->isIntegerTy(32) ||
 
  345      if (&
I != PN && &
I != Index)
 
  353  if (!
match(Header->getTerminator(),
 
  357      !CurLoop->contains(WhileBB))
 
  364  Value *LoadA, *LoadB;
 
  369      !CurLoop->contains(TrueBB))
 
  391  if (!CurLoop->isLoopInvariant(PtrA) || !CurLoop->isLoopInvariant(PtrB) ||
 
  430  if (FoundBB == EndBB) {
 
  432      Value *WhileCondVal = EndPN.getIncomingValueForBlock(Header);
 
  433      Value *WhileBodyVal = EndPN.getIncomingValueForBlock(WhileBB);
 
  439      if (WhileCondVal != WhileBodyVal &&
 
  440          ((WhileCondVal != Index && WhileCondVal != MaxLen) ||
 
  441           (WhileBodyVal != Index)))
 
  451  transformByteCompare(GEPA, GEPB, PN, MaxLen, Index, StartIdx, 
true,
 
  456Value *LoopIdiomVectorize::createMaskedFindMismatch(
 
  469      Intrinsic::get_active_lane_mask, {PredVTy, I64Type}, {ExtStart, ExtEnd});
 
  473      Builder.
CreateMul(VecLen, ConstantInt::get(I64Type, ByteCompareVF), 
"",
 
  480  Builder.
Insert(JumpToVectorLoop);
 
  483                     VectorLoopStartBlock}});
 
  488  PHINode *LoopPred = Builder.
CreatePHI(PredVTy, 2, 
"mismatch_vec_loop_pred");
 
  489  LoopPred->
addIncoming(InitialPred, VectorLoopPreheaderBlock);
 
  490  PHINode *VectorIndexPhi = Builder.
CreatePHI(I64Type, 2, 
"mismatch_vec_index");
 
  491  VectorIndexPhi->
addIncoming(ExtStart, VectorLoopPreheaderBlock);
 
  492  Type *VectorLoadType =
 
  496  Value *VectorLhsGep =
 
  499                                                  Align(1), LoopPred, Passthru);
 
  501  Value *VectorRhsGep =
 
  504                                                  Align(1), LoopPred, Passthru);
 
  507  VectorMatchCmp = Builder.
CreateSelect(LoopPred, VectorMatchCmp, PFalse);
 
  510      VectorLoopMismatchBlock, VectorLoopIncBlock, VectorMatchHasActiveLanes);
 
  511  Builder.
Insert(VectorEarlyExit);
 
  521  Value *NewVectorIndexPhi =
 
  522      Builder.
CreateAdd(VectorIndexPhi, VecLen, 
"",
 
  524  VectorIndexPhi->
addIncoming(NewVectorIndexPhi, VectorLoopIncBlock);
 
  527                              {PredVTy, I64Type}, {NewVectorIndexPhi, ExtEnd});
 
  528  LoopPred->
addIncoming(NewPred, VectorLoopIncBlock);
 
  530  Value *PredHasActiveLanes =
 
  534  Builder.
Insert(VectorLoopBranchBack);
 
  543  PHINode *FoundPred = Builder.
CreatePHI(PredVTy, 1, 
"mismatch_vec_found_pred");
 
  544  FoundPred->
addIncoming(VectorMatchCmp, VectorLoopStartBlock);
 
  546      Builder.
CreatePHI(PredVTy, 1, 
"mismatch_vec_last_loop_pred");
 
  547  LastLoopPred->
addIncoming(LoopPred, VectorLoopStartBlock);
 
  549      Builder.
CreatePHI(I64Type, 1, 
"mismatch_vec_found_index");
 
  550  VectorFoundIndex->
addIncoming(VectorIndexPhi, VectorLoopStartBlock);
 
  555  Value *VectorLoopRes64 = Builder.
CreateAdd(VectorFoundIndex, Ctz, 
"",
 
  557  return Builder.
CreateTrunc(VectorLoopRes64, ResType);
 
  560Value *LoopIdiomVectorize::createPredicatedFindMismatch(
 
  565  Type *ResType = I32Type;
 
  571  Builder.
Insert(JumpToVectorLoop);
 
  574                     VectorLoopStartBlock}});
 
  579  auto *VectorIndexPhi = Builder.
CreatePHI(I64Type, 2, 
"mismatch_vector_index");
 
  580  VectorIndexPhi->
addIncoming(ExtStart, VectorLoopPreheaderBlock);
 
  583  Value *AVL = Builder.
CreateSub(ExtEnd, VectorIndexPhi, 
"avl", 
true,
 
  587  auto *VF = ConstantInt::get(I32Type, ByteCompareVF);
 
  590                                      {I64Type}, {AVL, VF, Builder.
getTrue()});
 
  591  Value *GepOffset = VectorIndexPhi;
 
  593  Value *VectorLhsGep =
 
  599      Intrinsic::vp_load, {VectorLoadType, VectorLhsGep->
getType()},
 
  600      {VectorLhsGep, AllTrueMask, VL}, 
nullptr, 
"lhs.load");
 
  602  Value *VectorRhsGep =
 
  605      Intrinsic::vp_load, {VectorLoadType, VectorLhsGep->
getType()},
 
  606      {VectorRhsGep, AllTrueMask, VL}, 
nullptr, 
"rhs.load");
 
  608  Value *VectorMatchCmp =
 
  609      Builder.
CreateICmpNE(VectorLhsLoad, VectorRhsLoad, 
"mismatch.cmp");
 
  611      Intrinsic::vp_cttz_elts, {ResType, VectorMatchCmp->
getType()},
 
  612      {VectorMatchCmp, Builder.
getInt1(
false), AllTrueMask,
 
  616                                             VectorLoopIncBlock, MismatchFound);
 
  617  Builder.
Insert(VectorEarlyExit);
 
  628  Value *NewVectorIndexPhi =
 
  629      Builder.
CreateAdd(VectorIndexPhi, VL64, 
"",
 
  631  VectorIndexPhi->
addIncoming(NewVectorIndexPhi, VectorLoopIncBlock);
 
  633  auto *VectorLoopBranchBack =
 
  635  Builder.
Insert(VectorLoopBranchBack);
 
  647  CTZLCSSAPhi->
addIncoming(CTZ, VectorLoopStartBlock);
 
  648  auto *VectorIndexLCSSAPhi =
 
  650  VectorIndexLCSSAPhi->
addIncoming(VectorIndexPhi, VectorLoopStartBlock);
 
  653  Value *VectorLoopRes64 = Builder.
CreateAdd(VectorIndexLCSSAPhi, CTZI64, 
"",
 
  655  return Builder.
CreateTrunc(VectorLoopRes64, ResType);
 
  658Value *LoopIdiomVectorize::expandFindMismatch(
 
  665  BasicBlock *Preheader = CurLoop->getLoopPreheader();
 
  672  EndBlock = 
SplitBlock(Preheader, PHBranch, DT, LI, 
nullptr, 
"mismatch_end");
 
  688      Ctx, 
"mismatch_min_it_check", EndBlock->getParent(), EndBlock);
 
  694      Ctx, 
"mismatch_mem_check", EndBlock->getParent(), EndBlock);
 
  697      Ctx, 
"mismatch_vec_loop_preheader", EndBlock->getParent(), EndBlock);
 
  700                                            EndBlock->getParent(), EndBlock);
 
  703                                          EndBlock->getParent(), EndBlock);
 
  706                                               EndBlock->getParent(), EndBlock);
 
  709      Ctx, 
"mismatch_loop_pre", EndBlock->getParent(), EndBlock);
 
  715      Ctx, 
"mismatch_loop_inc", EndBlock->getParent(), EndBlock);
 
  721  auto VectorLoop = LI->AllocateLoop();
 
  722  auto ScalarLoop = LI->AllocateLoop();
 
  724  if (CurLoop->getParentLoop()) {
 
  725    CurLoop->getParentLoop()->addBasicBlockToLoop(MinItCheckBlock, *LI);
 
  726    CurLoop->getParentLoop()->addBasicBlockToLoop(MemCheckBlock, *LI);
 
  727    CurLoop->getParentLoop()->addBasicBlockToLoop(VectorLoopPreheaderBlock,
 
  729    CurLoop->getParentLoop()->addChildLoop(VectorLoop);
 
  730    CurLoop->getParentLoop()->addBasicBlockToLoop(VectorLoopMismatchBlock, *LI);
 
  731    CurLoop->getParentLoop()->addBasicBlockToLoop(LoopPreHeaderBlock, *LI);
 
  732    CurLoop->getParentLoop()->addChildLoop(ScalarLoop);
 
  734    LI->addTopLevelLoop(VectorLoop);
 
  735    LI->addTopLevelLoop(ScalarLoop);
 
  739  VectorLoop->addBasicBlockToLoop(VectorLoopStartBlock, *LI);
 
  740  VectorLoop->addBasicBlockToLoop(VectorLoopIncBlock, *LI);
 
  742  ScalarLoop->addBasicBlockToLoop(LoopStartBlock, *LI);
 
  743  ScalarLoop->addBasicBlockToLoop(LoopIncBlock, *LI);
 
  758      LLVMContext::MD_prof,
 
  760  Builder.
Insert(MinItCheckBr);
 
  800  Value *CombinedPageCmp = Builder.
CreateOr(LhsPageCmp, RhsPageCmp);
 
  802      LoopPreHeaderBlock, VectorLoopPreheaderBlock, CombinedPageCmp);
 
  806  Builder.
Insert(CombinedPageCmpCmpBr);
 
  822  Value *VectorLoopRes = 
nullptr;
 
  823  switch (VectorizeStyle) {
 
  826        createMaskedFindMismatch(Builder, DTU, GEPA, GEPB, ExtStart, ExtEnd);
 
  829    VectorLoopRes = createPredicatedFindMismatch(Builder, DTU, GEPA, GEPB,
 
  865  Builder.
Insert(MatchCmpBr);
 
  872  Value *PhiInc = Builder.
CreateAdd(IndexPhi, ConstantInt::get(ResType, 1), 
"",
 
  873                                    Index->hasNoUnsignedWrap(),
 
  874                                    Index->hasNoSignedWrap());
 
  890  Builder.
SetInsertPoint(EndBlock, EndBlock->getFirstInsertionPt());
 
  895  ResPhi->
addIncoming(VectorLoopRes, VectorLoopMismatchBlock);
 
  900    ScalarLoop->verifyLoop();
 
  901    VectorLoop->verifyLoop();
 
  902    if (!VectorLoop->isRecursivelyLCSSAForm(*DT, *LI))
 
  904    if (!ScalarLoop->isRecursivelyLCSSAForm(*DT, *LI))
 
  919  BasicBlock *Preheader = CurLoop->getLoopPreheader();
 
  931      expandFindMismatch(Builder, DTU, GEPA, GEPB, Index, Start, MaxLen);
 
  935  assert(IndPhi->
hasOneUse() && 
"Index phi node has more than one use!");
 
  936  Index->replaceAllUsesWith(ByteCmpRes);
 
  939         "Expected preheader to terminate with an unconditional branch.");
 
  945  CmpBB->moveBefore(EndBB);
 
  958  if (FoundBB != EndBB) {
 
  971  if (EndBB != FoundBB)
 
  976  if (!CurLoop->isOutermost())
 
  977    CurLoop->getParentLoop()->addBasicBlockToLoop(CmpBB, *LI);
 
  980    CurLoop->getParentLoop()->verifyLoop();
 
  981    if (!CurLoop->getParentLoop()->isRecursivelyLCSSAForm(*DT, *LI))
 
  986bool LoopIdiomVectorize::recognizeFindFirstByte() {
 
  991  if (!
TTI->supportsScalableVectors() || !
TTI->getMinPageSize().has_value() ||
 
 1002  if (CurLoop->getNumBackEdges() != 1 || CurLoop->getNumBlocks() != 4 ||
 
 1003      CurLoop->getSubLoops().size() != 1)
 
 1006  auto *InnerLoop = CurLoop->getSubLoops().front();
 
 1012  auto LoopBlocks = CurLoop->getBlocks();
 
 1013  if (LoopBlocks[0]->sizeWithoutDebug() > 3 ||
 
 1014      LoopBlocks[1]->sizeWithoutDebug() > 4 ||
 
 1015      LoopBlocks[2]->sizeWithoutDebug() > 3 ||
 
 1016      LoopBlocks[3]->sizeWithoutDebug() > 3)
 
 1036      !InnerLoop->contains(MatchBB))
 
 1048  Value *LoadSearch, *LoadNeedle;
 
 1065  Value *Search, *Needle;
 
 1098  if (InnerLoop->contains(PSearch))
 
 1100  if (PSearch != &Header->front() || PNeedle != &MatchBB->
front())
 
 1138      !CurLoop->contains(OuterBB))
 
 1155  if (!CurLoop->isLoopInvariant(SearchStart) ||
 
 1156      !CurLoop->isLoopInvariant(SearchEnd) ||
 
 1157      !CurLoop->isLoopInvariant(NeedleStart) ||
 
 1158      !CurLoop->isLoopInvariant(NeedleEnd))
 
 1161  LLVM_DEBUG(
dbgs() << 
"Found idiom in loop: \n" << *CurLoop << 
"\n\n");
 
 1163  transformFindFirstByte(IndPhi, VF, CharTy, ExitSucc, ExitFail, SearchStart,
 
 1164                         SearchEnd, NeedleStart, NeedleEnd);
 
 1168Value *LoopIdiomVectorize::expandFindFirstByte(
 
 1178  auto *ConstVF = ConstantInt::get(I64Ty, VF);
 
 1181  BasicBlock *Preheader = CurLoop->getLoopPreheader();
 
 1188                               nullptr, 
"scalar_preheader");
 
 1223  auto OuterLoop = LI->AllocateLoop();
 
 1224  auto InnerLoop = LI->AllocateLoop();
 
 1226  if (
auto ParentLoop = CurLoop->getParentLoop()) {
 
 1227    ParentLoop->addBasicBlockToLoop(BB0, *LI);
 
 1228    ParentLoop->addChildLoop(OuterLoop);
 
 1229    ParentLoop->addBasicBlockToLoop(BB3, *LI);
 
 1231    LI->addTopLevelLoop(OuterLoop);
 
 1235  OuterLoop->addChildLoop(InnerLoop);
 
 1238  OuterLoop->addBasicBlockToLoop(BB1, *LI);
 
 1239  OuterLoop->addBasicBlockToLoop(BB5, *LI);
 
 1240  InnerLoop->addBasicBlockToLoop(BB2, *LI);
 
 1241  InnerLoop->addBasicBlockToLoop(BB4, *LI);
 
 1252  Value *ISearchStart =
 
 1256  Value *INeedleStart =
 
 1261      Builder.
CreateIntrinsic(Intrinsic::get_active_lane_mask, {PredVTy, I64Ty},
 
 1262                              {ConstantInt::get(I64Ty, 0), ConstVF});
 
 1266  Value *SearchStartPage =
 
 1267      Builder.
CreateLShr(ISearchStart, AddrShiftAmt, 
"search_start_page");
 
 1268  Value *SearchEndPage =
 
 1269      Builder.
CreateLShr(ISearchEnd, AddrShiftAmt, 
"search_end_page");
 
 1270  Value *NeedleStartPage =
 
 1271      Builder.
CreateLShr(INeedleStart, AddrShiftAmt, 
"needle_start_page");
 
 1272  Value *NeedleEndPage =
 
 1273      Builder.
CreateLShr(INeedleEnd, AddrShiftAmt, 
"needle_end_page");
 
 1274  Value *SearchPageCmp =
 
 1275      Builder.
CreateICmpNE(SearchStartPage, SearchEndPage, 
"search_page_cmp");
 
 1276  Value *NeedlePageCmp =
 
 1277      Builder.
CreateICmpNE(NeedleStartPage, NeedleEndPage, 
"needle_page_cmp");
 
 1279  Value *CombinedPageCmp =
 
 1280      Builder.
CreateOr(SearchPageCmp, NeedlePageCmp, 
"combined_page_cmp");
 
 1291      Intrinsic::get_active_lane_mask, {PredVTy, I64Ty},
 
 1294  PredSearch = Builder.
CreateAnd(PredVF, PredSearch, 
"search_masked");
 
 1296      CharVTy, Search, 
Align(1), PredSearch, Passthru, 
"search_load_vec");
 
 1306      Intrinsic::get_active_lane_mask, {PredVTy, I64Ty},
 
 1309  PredNeedle = Builder.
CreateAnd(PredVF, PredNeedle, 
"needle_masked");
 
 1311      CharVTy, Needle, 
Align(1), PredNeedle, Passthru, 
"needle_load_vec");
 
 1317                                                  Needle0, 
"needle0");
 
 1318  LoadNeedle = Builder.
CreateSelect(PredNeedle, LoadNeedle, Needle0Splat,
 
 1325      Intrinsic::experimental_vector_match, {CharVTy, LoadNeedle->
getType()},
 
 1326      {LoadSearch, LoadNeedle, PredSearch}, 
nullptr, 
"match_pred");
 
 1338      Intrinsic::experimental_cttz_elts, {I64Ty, MatchPred->
getType()},
 
 1339      {MatchPredLCSSA, Builder.
getInt1(
true)}, 
nullptr,
 
 1342      Builder.
CreateGEP(CharTy, MatchLCSSA, MatchCnt, 
"match_res");
 
 1349      Builder.
CreateGEP(CharTy, Needle, ConstVF, 
"needle_next_vec");
 
 1357      Builder.
CreateGEP(CharTy, Search, ConstVF, 
"search_next_vec");
 
 1375  if (ExitSucc != ExitFail)
 
 1379    OuterLoop->verifyLoop();
 
 1380    InnerLoop->verifyLoop();
 
 1381    if (!OuterLoop->isRecursivelyLCSSAForm(*DT, *LI))
 
 1388void LoopIdiomVectorize::transformFindFirstByte(
 
 1393  BasicBlock *Preheader = CurLoop->getLoopPreheader();
 
 1399  expandFindFirstByte(Builder, DTU, VF, CharTy, IndPhi, ExitSucc, ExitFail,
 
 1400                      SearchStart, SearchEnd, NeedleStart, NeedleEnd);
 
 1403         "Expected preheader to terminate with an unconditional branch.");
 
 1406    CurLoop->getParentLoop()->verifyLoop();
 
 1407    if (!CurLoop->getParentLoop()->isRecursivelyLCSSAForm(*DT, *LI))
 
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
 
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
 
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
 
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
 
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
 
static cl::opt< bool > VerifyLoops("loop-idiom-vectorize-verify", cl::Hidden, cl::init(false), cl::desc("Verify loops generated Loop Idiom Vectorize Pass."))
 
static cl::opt< bool > DisableAll("disable-loop-idiom-vectorize-all", cl::Hidden, cl::init(false), cl::desc("Disable Loop Idiom Vectorize Pass."))
 
static void fixSuccessorPhis(Loop *L, Value *ScalarRes, Value *VectorRes, BasicBlock *SuccBB, BasicBlock *IncBB)
 
static cl::opt< LoopIdiomVectorizeStyle > LITVecStyle("loop-idiom-vectorize-style", cl::Hidden, cl::desc("The vectorization style for loop idiom transform."), cl::values(clEnumValN(LoopIdiomVectorizeStyle::Masked, "masked", "Use masked vector intrinsics"), clEnumValN(LoopIdiomVectorizeStyle::Predicated, "predicated", "Use VP intrinsics")), cl::init(LoopIdiomVectorizeStyle::Masked))
 
static cl::opt< bool > DisableFindFirstByte("disable-loop-idiom-vectorize-find-first-byte", cl::Hidden, cl::init(false), cl::desc("Do not convert find-first-byte loop(s)."))
 
static cl::opt< unsigned > ByteCmpVF("loop-idiom-vectorize-bytecmp-vf", cl::Hidden, cl::desc("The vectorization factor for byte-compare patterns."), cl::init(16))
 
static cl::opt< bool > DisableByteCmp("disable-loop-idiom-vectorize-bytecmp", cl::Hidden, cl::init(false), cl::desc("Proceed with Loop Idiom Vectorize Pass, but do " "not convert byte-compare loop(s)."))
 
static bool isSimple(Instruction *I)
 
LLVM Basic Block Representation.
 
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
 
const Function * getParent() const
Return the enclosing method, or null if none.
 
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
 
const Instruction & front() const
 
LLVM_ABI 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...
 
Conditional or Unconditional Branch instruction.
 
static BranchInst * Create(BasicBlock *IfTrue, InsertPosition InsertBefore=nullptr)
 
bool isUnconditional() const
 
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
 
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
 
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
 
A parsed version of the target data layout string in and methods for querying it.
 
static constexpr UpdateKind Delete
 
static constexpr UpdateKind Insert
 
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
 
static constexpr ElementCount getScalable(ScalarTy MinVal)
 
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
 
void applyUpdates(ArrayRef< UpdateT > Updates)
Submit updates to all available trees.
 
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
 
LLVM_ABI bool isInBounds() const
Determine whether the GEP has the inbounds flag.
 
Value * getPointerOperand()
 
Type * getResultElementType() const
 
unsigned getNumIndices() const
 
ConstantInt * getInt1(bool V)
Get a constant value representing either true or false.
 
Value * CreateICmpULT(Value *LHS, Value *RHS, const Twine &Name="")
 
CallInst * CreateExtractVector(Type *DstType, Value *SrcVec, Value *Idx, const Twine &Name="")
Create a call to the vector.extract intrinsic.
 
IntegerType * getInt1Ty()
Fetch the type representing a single bit.
 
Value * CreateExtractElement(Value *Vec, Value *Idx, const Twine &Name="")
 
LLVM_ABI Value * CreateVectorSplat(unsigned NumElts, Value *V, const Twine &Name="")
Return a vector value that contains.
 
ConstantInt * getTrue()
Get the constant value for i1 true.
 
LLVM_ABI CallInst * CreateMaskedLoad(Type *Ty, Value *Ptr, Align Alignment, Value *Mask, Value *PassThru=nullptr, const Twine &Name="")
Create a call to Masked Load intrinsic.
 
LLVM_ABI Value * CreateSelect(Value *C, Value *True, Value *False, const Twine &Name="", Instruction *MDFrom=nullptr)
 
Value * CreateLShr(Value *LHS, Value *RHS, const Twine &Name="", bool isExact=false)
 
IntegerType * getInt32Ty()
Fetch the type representing a 32-bit integer.
 
Value * CreateVScale(Type *Ty, const Twine &Name="")
Create a call to llvm.vscale.<Ty>().
 
void SetCurrentDebugLocation(DebugLoc L)
Set location information used by debugging information.
 
IntegerType * getInt64Ty()
Fetch the type representing a 64-bit integer.
 
Value * CreateICmpNE(Value *LHS, Value *RHS, const Twine &Name="")
 
Value * CreateGEP(Type *Ty, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &Name="", GEPNoWrapFlags NW=GEPNoWrapFlags::none())
 
LLVM_ABI CallInst * CreateOrReduce(Value *Src)
Create a vector int OR reduction intrinsic of the source vector.
 
LLVM_ABI CallInst * CreateIntrinsic(Intrinsic::ID ID, ArrayRef< Type * > Types, ArrayRef< Value * > Args, FMFSource FMFSource={}, const Twine &Name="")
Create a call to intrinsic ID with Args, mangled using Types.
 
PHINode * CreatePHI(Type *Ty, unsigned NumReservedValues, const Twine &Name="")
 
Value * CreateICmpEQ(Value *LHS, Value *RHS, const Twine &Name="")
 
InstTy * Insert(InstTy *I, const Twine &Name="") const
Insert and return the specified instruction.
 
Value * CreateCountTrailingZeroElems(Type *ResTy, Value *Mask, bool ZeroIsPoison=true, const Twine &Name="")
Create a call to llvm.experimental_cttz_elts.
 
Value * CreateSub(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
 
BranchInst * CreateCondBr(Value *Cond, BasicBlock *True, BasicBlock *False, MDNode *BranchWeights=nullptr, MDNode *Unpredictable=nullptr)
Create a conditional 'br Cond, TrueDest, FalseDest' instruction.
 
LoadInst * CreateLoad(Type *Ty, Value *Ptr, const char *Name)
Provided to resolve 'CreateLoad(Ty, Ptr, "...")' correctly, instead of converting the string to 'bool...
 
Value * CreateZExt(Value *V, Type *DestTy, const Twine &Name="", bool IsNonNeg=false)
 
Value * CreateAnd(Value *LHS, Value *RHS, const Twine &Name="")
 
Value * CreateAdd(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
 
Value * CreatePtrToInt(Value *V, Type *DestTy, const Twine &Name="")
 
Value * CreateTrunc(Value *V, Type *DestTy, const Twine &Name="", bool IsNUW=false, bool IsNSW=false)
 
PointerType * getPtrTy(unsigned AddrSpace=0)
Fetch the type representing a pointer.
 
BranchInst * CreateBr(BasicBlock *Dest)
Create an unconditional 'br label X' instruction.
 
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
 
Value * CreateICmpULE(Value *LHS, Value *RHS, const Twine &Name="")
 
Value * CreateOr(Value *LHS, Value *RHS, const Twine &Name="", bool IsDisjoint=false)
 
IntegerType * getInt8Ty()
Fetch the type representing an 8-bit integer.
 
Value * CreateMul(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
 
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
 
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
 
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
 
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
 
LLVM_ABI void setSuccessor(unsigned Idx, BasicBlock *BB)
Update the specified successor to point at the provided block.
 
This is an important class for using LLVM in a threaded context.
 
This class provides an interface for updating the loop pass manager based on mutations to the loop ne...
 
An instruction for reading from memory.
 
PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U)
 
Represents a single loop in the control flow graph.
 
LLVM_ABI MDNode * createBranchWeights(uint32_t TrueWeight, uint32_t FalseWeight, bool IsExpected=false)
Return metadata containing two branch weights.
 
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
 
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.
 
A set of analyses that are preserved following a run of a transformation pass.
 
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
 
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
 
Class to represent scalable SIMD vectors.
 
static LLVM_ABI ScalableVectorType * get(Type *ElementType, unsigned MinNumElts)
 
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
 
The instances of the Type class are immutable: once they are created, they are never changed.
 
LLVM_ABI unsigned getIntegerBitWidth() const
 
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
 
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
 
bool isIntegerTy() const
True if this is an instance of IntegerType.
 
Value * getOperand(unsigned i) const
 
LLVM Value Representation.
 
Type * getType() const
All values are typed, get the type of this value.
 
bool hasOneUse() const
Return true if there is exactly one use of this value.
 
iterator_range< user_iterator > users()
 
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
 
Base class of all SIMD vector types.
 
ElementCount getElementCount() const
Return an ElementCount instance to represent the (possibly scalable) number of elements in the vector...
 
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
 
const ParentTy * getParent() const
 
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
 
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
 
br_match m_UnconditionalBr(BasicBlock *&Succ)
 
bool match(Val *V, const Pattern &P)
 
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
 
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
 
auto m_GEP(const OperandTypes &...Ops)
Matches GetElementPtrInst.
 
SpecificCmpClass_match< LHS, RHS, ICmpInst > m_SpecificICmp(CmpPredicate MatchPred, const LHS &L, const RHS &R)
 
OneOps_match< OpTy, Instruction::Load > m_Load(const OpTy &Op)
Matches LoadInst.
 
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
 
brc_match< Cond_t, bind_ty< BasicBlock >, bind_ty< BasicBlock > > m_Br(const Cond_t &C, BasicBlock *&T, BasicBlock *&F)
 
BinaryOp_match< LHS, RHS, Instruction::Add, true > m_c_Add(const LHS &L, const RHS &R)
Matches a Add with LHS and RHS in either order.
 
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
 
CmpClass_match< LHS, RHS, ICmpInst > m_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
 
class_match< BasicBlock > m_BasicBlock()
Match an arbitrary basic block value and ignore it.
 
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
 
initializer< Ty > init(const Ty &Val)
 
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
 
This is an optimization pass for GlobalISel generic memory operations.
 
FunctionAddr VTableAddr Value
 
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
 
unsigned Log2_64(uint64_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
 
AnalysisManager< Loop, LoopStandardAnalysisResults & > LoopAnalysisManager
The loop analysis manager.
 
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
 
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
 
IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *, ArrayRef< OperandBundleDef >) -> IRBuilder< FolderTy, InserterTy >
 
DWARFExpression::Operation Op
 
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
 
LLVM_ABI 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.
 
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.
 
The adaptor from a function pass to a loop pass computes these analyses and makes them available to t...
 
TargetTransformInfo & TTI