brintos

brintos / llvm-project-archived public Read only

0
0
Text · 133.5 KiB · 1730ec0 Raw
3592 lines · cpp
1//===- LoopIdiomRecognize.cpp - Loop idiom recognition --------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This pass implements an idiom recognizer that transforms simple loops into a10// non-loop form.  In cases that this kicks in, it can be a significant11// performance win.12//13// If compiling for code size we avoid idiom recognition if the resulting14// code could be larger than the code for the original loop. One way this could15// happen is if the loop is not removable after idiom recognition due to the16// presence of non-idiom instructions. The initial implementation of the17// heuristics applies to idioms in multi-block loops.18//19//===----------------------------------------------------------------------===//20//21// TODO List:22//23// Future loop memory idioms to recognize: memcmp, etc.24//25// This could recognize common matrix multiplies and dot product idioms and26// replace them with calls to BLAS (if linked in??).27//28//===----------------------------------------------------------------------===//29 30#include "llvm/Transforms/Scalar/LoopIdiomRecognize.h"31#include "llvm/ADT/APInt.h"32#include "llvm/ADT/ArrayRef.h"33#include "llvm/ADT/DenseMap.h"34#include "llvm/ADT/MapVector.h"35#include "llvm/ADT/SetVector.h"36#include "llvm/ADT/SmallPtrSet.h"37#include "llvm/ADT/SmallVector.h"38#include "llvm/ADT/Statistic.h"39#include "llvm/ADT/StringRef.h"40#include "llvm/Analysis/AliasAnalysis.h"41#include "llvm/Analysis/CmpInstAnalysis.h"42#include "llvm/Analysis/HashRecognize.h"43#include "llvm/Analysis/LoopInfo.h"44#include "llvm/Analysis/LoopPass.h"45#include "llvm/Analysis/MemoryLocation.h"46#include "llvm/Analysis/MemorySSA.h"47#include "llvm/Analysis/MemorySSAUpdater.h"48#include "llvm/Analysis/MustExecute.h"49#include "llvm/Analysis/OptimizationRemarkEmitter.h"50#include "llvm/Analysis/ScalarEvolution.h"51#include "llvm/Analysis/ScalarEvolutionExpressions.h"52#include "llvm/Analysis/ScalarEvolutionPatternMatch.h"53#include "llvm/Analysis/TargetLibraryInfo.h"54#include "llvm/Analysis/TargetTransformInfo.h"55#include "llvm/Analysis/ValueTracking.h"56#include "llvm/IR/BasicBlock.h"57#include "llvm/IR/Constant.h"58#include "llvm/IR/Constants.h"59#include "llvm/IR/DataLayout.h"60#include "llvm/IR/DebugLoc.h"61#include "llvm/IR/DerivedTypes.h"62#include "llvm/IR/Dominators.h"63#include "llvm/IR/GlobalValue.h"64#include "llvm/IR/GlobalVariable.h"65#include "llvm/IR/IRBuilder.h"66#include "llvm/IR/InstrTypes.h"67#include "llvm/IR/Instruction.h"68#include "llvm/IR/Instructions.h"69#include "llvm/IR/IntrinsicInst.h"70#include "llvm/IR/Intrinsics.h"71#include "llvm/IR/LLVMContext.h"72#include "llvm/IR/Module.h"73#include "llvm/IR/PassManager.h"74#include "llvm/IR/PatternMatch.h"75#include "llvm/IR/ProfDataUtils.h"76#include "llvm/IR/Type.h"77#include "llvm/IR/User.h"78#include "llvm/IR/Value.h"79#include "llvm/IR/ValueHandle.h"80#include "llvm/Support/Casting.h"81#include "llvm/Support/CommandLine.h"82#include "llvm/Support/Debug.h"83#include "llvm/Support/InstructionCost.h"84#include "llvm/Support/raw_ostream.h"85#include "llvm/Transforms/Utils/BuildLibCalls.h"86#include "llvm/Transforms/Utils/Local.h"87#include "llvm/Transforms/Utils/LoopUtils.h"88#include "llvm/Transforms/Utils/ScalarEvolutionExpander.h"89#include <algorithm>90#include <cassert>91#include <cstdint>92#include <utility>93 94using namespace llvm;95using namespace SCEVPatternMatch;96 97#define DEBUG_TYPE "loop-idiom"98 99STATISTIC(NumMemSet, "Number of memset's formed from loop stores");100STATISTIC(NumMemCpy, "Number of memcpy's formed from loop load+stores");101STATISTIC(NumMemMove, "Number of memmove's formed from loop load+stores");102STATISTIC(NumStrLen, "Number of strlen's and wcslen's formed from loop loads");103STATISTIC(104    NumShiftUntilBitTest,105    "Number of uncountable loops recognized as 'shift until bitttest' idiom");106STATISTIC(NumShiftUntilZero,107          "Number of uncountable loops recognized as 'shift until zero' idiom");108 109namespace llvm {110bool DisableLIRP::All;111static cl::opt<bool, true>112    DisableLIRPAll("disable-" DEBUG_TYPE "-all",113                   cl::desc("Options to disable Loop Idiom Recognize Pass."),114                   cl::location(DisableLIRP::All), cl::init(false),115                   cl::ReallyHidden);116 117bool DisableLIRP::Memset;118static cl::opt<bool, true>119    DisableLIRPMemset("disable-" DEBUG_TYPE "-memset",120                      cl::desc("Proceed with loop idiom recognize pass, but do "121                               "not convert loop(s) to memset."),122                      cl::location(DisableLIRP::Memset), cl::init(false),123                      cl::ReallyHidden);124 125bool DisableLIRP::Memcpy;126static cl::opt<bool, true>127    DisableLIRPMemcpy("disable-" DEBUG_TYPE "-memcpy",128                      cl::desc("Proceed with loop idiom recognize pass, but do "129                               "not convert loop(s) to memcpy."),130                      cl::location(DisableLIRP::Memcpy), cl::init(false),131                      cl::ReallyHidden);132 133bool DisableLIRP::Strlen;134static cl::opt<bool, true>135    DisableLIRPStrlen("disable-loop-idiom-strlen",136                      cl::desc("Proceed with loop idiom recognize pass, but do "137                               "not convert loop(s) to strlen."),138                      cl::location(DisableLIRP::Strlen), cl::init(false),139                      cl::ReallyHidden);140 141bool DisableLIRP::Wcslen;142static cl::opt<bool, true>143    EnableLIRPWcslen("disable-loop-idiom-wcslen",144                     cl::desc("Proceed with loop idiom recognize pass, "145                              "enable conversion of loop(s) to wcslen."),146                     cl::location(DisableLIRP::Wcslen), cl::init(false),147                     cl::ReallyHidden);148 149bool DisableLIRP::HashRecognize;150static cl::opt<bool, true>151    DisableLIRPHashRecognize("disable-" DEBUG_TYPE "-hashrecognize",152                             cl::desc("Proceed with loop idiom recognize pass, "153                                      "but do not optimize CRC loops."),154                             cl::location(DisableLIRP::HashRecognize),155                             cl::init(false), cl::ReallyHidden);156 157static cl::opt<bool> UseLIRCodeSizeHeurs(158    "use-lir-code-size-heurs",159    cl::desc("Use loop idiom recognition code size heuristics when compiling "160             "with -Os/-Oz"),161    cl::init(true), cl::Hidden);162 163static cl::opt<bool> ForceMemsetPatternIntrinsic(164    "loop-idiom-force-memset-pattern-intrinsic",165    cl::desc("Use memset.pattern intrinsic whenever possible"), cl::init(false),166    cl::Hidden);167 168extern cl::opt<bool> ProfcheckDisableMetadataFixes;169 170} // namespace llvm171 172namespace {173 174class LoopIdiomRecognize {175  Loop *CurLoop = nullptr;176  AliasAnalysis *AA;177  DominatorTree *DT;178  LoopInfo *LI;179  ScalarEvolution *SE;180  TargetLibraryInfo *TLI;181  const TargetTransformInfo *TTI;182  const DataLayout *DL;183  OptimizationRemarkEmitter &ORE;184  bool ApplyCodeSizeHeuristics;185  std::unique_ptr<MemorySSAUpdater> MSSAU;186 187public:188  explicit LoopIdiomRecognize(AliasAnalysis *AA, DominatorTree *DT,189                              LoopInfo *LI, ScalarEvolution *SE,190                              TargetLibraryInfo *TLI,191                              const TargetTransformInfo *TTI, MemorySSA *MSSA,192                              const DataLayout *DL,193                              OptimizationRemarkEmitter &ORE)194      : AA(AA), DT(DT), LI(LI), SE(SE), TLI(TLI), TTI(TTI), DL(DL), ORE(ORE) {195    if (MSSA)196      MSSAU = std::make_unique<MemorySSAUpdater>(MSSA);197  }198 199  bool runOnLoop(Loop *L);200 201private:202  using StoreList = SmallVector<StoreInst *, 8>;203  using StoreListMap = MapVector<Value *, StoreList>;204 205  StoreListMap StoreRefsForMemset;206  StoreListMap StoreRefsForMemsetPattern;207  StoreList StoreRefsForMemcpy;208  bool HasMemset;209  bool HasMemsetPattern;210  bool HasMemcpy;211 212  /// Return code for isLegalStore()213  enum LegalStoreKind {214    None = 0,215    Memset,216    MemsetPattern,217    Memcpy,218    UnorderedAtomicMemcpy,219    DontUse // Dummy retval never to be used. Allows catching errors in retval220            // handling.221  };222 223  /// \name Countable Loop Idiom Handling224  /// @{225 226  bool runOnCountableLoop();227  bool runOnLoopBlock(BasicBlock *BB, const SCEV *BECount,228                      SmallVectorImpl<BasicBlock *> &ExitBlocks);229 230  void collectStores(BasicBlock *BB);231  LegalStoreKind isLegalStore(StoreInst *SI);232  enum class ForMemset { No, Yes };233  bool processLoopStores(SmallVectorImpl<StoreInst *> &SL, const SCEV *BECount,234                         ForMemset For);235 236  template <typename MemInst>237  bool processLoopMemIntrinsic(238      BasicBlock *BB,239      bool (LoopIdiomRecognize::*Processor)(MemInst *, const SCEV *),240      const SCEV *BECount);241  bool processLoopMemCpy(MemCpyInst *MCI, const SCEV *BECount);242  bool processLoopMemSet(MemSetInst *MSI, const SCEV *BECount);243 244  bool processLoopStridedStore(Value *DestPtr, const SCEV *StoreSizeSCEV,245                               MaybeAlign StoreAlignment, Value *StoredVal,246                               Instruction *TheStore,247                               SmallPtrSetImpl<Instruction *> &Stores,248                               const SCEVAddRecExpr *Ev, const SCEV *BECount,249                               bool IsNegStride, bool IsLoopMemset = false);250  bool processLoopStoreOfLoopLoad(StoreInst *SI, const SCEV *BECount);251  bool processLoopStoreOfLoopLoad(Value *DestPtr, Value *SourcePtr,252                                  const SCEV *StoreSize, MaybeAlign StoreAlign,253                                  MaybeAlign LoadAlign, Instruction *TheStore,254                                  Instruction *TheLoad,255                                  const SCEVAddRecExpr *StoreEv,256                                  const SCEVAddRecExpr *LoadEv,257                                  const SCEV *BECount);258  bool avoidLIRForMultiBlockLoop(bool IsMemset = false,259                                 bool IsLoopMemset = false);260  bool optimizeCRCLoop(const PolynomialInfo &Info);261 262  /// @}263  /// \name Noncountable Loop Idiom Handling264  /// @{265 266  bool runOnNoncountableLoop();267 268  bool recognizePopcount();269  void transformLoopToPopcount(BasicBlock *PreCondBB, Instruction *CntInst,270                               PHINode *CntPhi, Value *Var);271  bool isProfitableToInsertFFS(Intrinsic::ID IntrinID, Value *InitX,272                               bool ZeroCheck, size_t CanonicalSize);273  bool insertFFSIfProfitable(Intrinsic::ID IntrinID, Value *InitX,274                             Instruction *DefX, PHINode *CntPhi,275                             Instruction *CntInst);276  bool recognizeAndInsertFFS();  /// Find First Set: ctlz or cttz277  bool recognizeShiftUntilLessThan();278  void transformLoopToCountable(Intrinsic::ID IntrinID, BasicBlock *PreCondBB,279                                Instruction *CntInst, PHINode *CntPhi,280                                Value *Var, Instruction *DefX,281                                const DebugLoc &DL, bool ZeroCheck,282                                bool IsCntPhiUsedOutsideLoop,283                                bool InsertSub = false);284 285  bool recognizeShiftUntilBitTest();286  bool recognizeShiftUntilZero();287  bool recognizeAndInsertStrLen();288 289  /// @}290};291} // end anonymous namespace292 293PreservedAnalyses LoopIdiomRecognizePass::run(Loop &L, LoopAnalysisManager &AM,294                                              LoopStandardAnalysisResults &AR,295                                              LPMUpdater &) {296  if (DisableLIRP::All)297    return PreservedAnalyses::all();298 299  const auto *DL = &L.getHeader()->getDataLayout();300 301  // For the new PM, we also can't use OptimizationRemarkEmitter as an analysis302  // pass.  Function analyses need to be preserved across loop transformations303  // but ORE cannot be preserved (see comment before the pass definition).304  OptimizationRemarkEmitter ORE(L.getHeader()->getParent());305 306  LoopIdiomRecognize LIR(&AR.AA, &AR.DT, &AR.LI, &AR.SE, &AR.TLI, &AR.TTI,307                         AR.MSSA, DL, ORE);308  if (!LIR.runOnLoop(&L))309    return PreservedAnalyses::all();310 311  auto PA = getLoopPassPreservedAnalyses();312  if (AR.MSSA)313    PA.preserve<MemorySSAAnalysis>();314  return PA;315}316 317static void deleteDeadInstruction(Instruction *I) {318  I->replaceAllUsesWith(PoisonValue::get(I->getType()));319  I->eraseFromParent();320}321 322//===----------------------------------------------------------------------===//323//324//          Implementation of LoopIdiomRecognize325//326//===----------------------------------------------------------------------===//327 328bool LoopIdiomRecognize::runOnLoop(Loop *L) {329  CurLoop = L;330  // If the loop could not be converted to canonical form, it must have an331  // indirectbr in it, just give up.332  if (!L->getLoopPreheader())333    return false;334 335  // Disable loop idiom recognition if the function's name is a common idiom.336  StringRef Name = L->getHeader()->getParent()->getName();337  if (Name == "memset" || Name == "memcpy" || Name == "strlen" ||338      Name == "wcslen")339    return false;340 341  // Determine if code size heuristics need to be applied.342  ApplyCodeSizeHeuristics =343      L->getHeader()->getParent()->hasOptSize() && UseLIRCodeSizeHeurs;344 345  HasMemset = TLI->has(LibFunc_memset);346  // TODO: Unconditionally enable use of the memset pattern intrinsic (or at347  // least, opt-in via target hook) once we are confident it will never result348  // in worse codegen than without. For now, use it only when the target349  // supports memset_pattern16 libcall (or unless this is overridden by350  // command line option).351  HasMemsetPattern = TLI->has(LibFunc_memset_pattern16);352  HasMemcpy = TLI->has(LibFunc_memcpy);353 354  if (HasMemset || HasMemsetPattern || ForceMemsetPatternIntrinsic ||355      HasMemcpy || !DisableLIRP::HashRecognize)356    if (SE->hasLoopInvariantBackedgeTakenCount(L))357      return runOnCountableLoop();358 359  return runOnNoncountableLoop();360}361 362bool LoopIdiomRecognize::runOnCountableLoop() {363  const SCEV *BECount = SE->getBackedgeTakenCount(CurLoop);364  assert(!isa<SCEVCouldNotCompute>(BECount) &&365         "runOnCountableLoop() called on a loop without a predictable"366         "backedge-taken count");367 368  // If this loop executes exactly one time, then it should be peeled, not369  // optimized by this pass.370  if (BECount->isZero())371    return false;372 373  SmallVector<BasicBlock *, 8> ExitBlocks;374  CurLoop->getUniqueExitBlocks(ExitBlocks);375 376  LLVM_DEBUG(dbgs() << DEBUG_TYPE " Scanning: F["377                    << CurLoop->getHeader()->getParent()->getName()378                    << "] Countable Loop %" << CurLoop->getHeader()->getName()379                    << "\n");380 381  // The following transforms hoist stores/memsets into the loop pre-header.382  // Give up if the loop has instructions that may throw.383  SimpleLoopSafetyInfo SafetyInfo;384  SafetyInfo.computeLoopSafetyInfo(CurLoop);385  if (SafetyInfo.anyBlockMayThrow())386    return false;387 388  bool MadeChange = false;389 390  // Scan all the blocks in the loop that are not in subloops.391  for (auto *BB : CurLoop->getBlocks()) {392    // Ignore blocks in subloops.393    if (LI->getLoopFor(BB) != CurLoop)394      continue;395 396    MadeChange |= runOnLoopBlock(BB, BECount, ExitBlocks);397  }398 399  // Optimize a CRC loop if HashRecognize found one, provided we're not400  // optimizing for size.401  if (!DisableLIRP::HashRecognize && !ApplyCodeSizeHeuristics)402    if (auto Res = HashRecognize(*CurLoop, *SE).getResult())403      optimizeCRCLoop(*Res);404 405  return MadeChange;406}407 408static APInt getStoreStride(const SCEVAddRecExpr *StoreEv) {409  const SCEVConstant *ConstStride = cast<SCEVConstant>(StoreEv->getOperand(1));410  return ConstStride->getAPInt();411}412 413/// getMemSetPatternValue - If a strided store of the specified value is safe to414/// turn into a memset.patternn intrinsic, return the Constant that should415/// be passed in. Otherwise, return null.416///417/// TODO this function could allow more constants than it does today (e.g.418/// those over 16 bytes) now it has transitioned to being used for the419/// memset.pattern intrinsic rather than directly the memset_pattern16420/// libcall.421static Constant *getMemSetPatternValue(Value *V, const DataLayout *DL) {422  // FIXME: This could check for UndefValue because it can be merged into any423  // other valid pattern.424 425  // If the value isn't a constant, we can't promote it to being in a constant426  // array.  We could theoretically do a store to an alloca or something, but427  // that doesn't seem worthwhile.428  Constant *C = dyn_cast<Constant>(V);429  if (!C || isa<ConstantExpr>(C))430    return nullptr;431 432  // Only handle simple values that are a power of two bytes in size.433  uint64_t Size = DL->getTypeSizeInBits(V->getType());434  if (Size == 0 || (Size & 7) || (Size & (Size - 1)))435    return nullptr;436 437  // Don't care enough about darwin/ppc to implement this.438  if (DL->isBigEndian())439    return nullptr;440 441  // Convert to size in bytes.442  Size /= 8;443 444  // TODO: If CI is larger than 16-bytes, we can try slicing it in half to see445  // if the top and bottom are the same (e.g. for vectors and large integers).446  if (Size > 16)447    return nullptr;448 449  // For now, don't handle types that aren't int, floats, or pointers.450  Type *CTy = C->getType();451  if (!CTy->isIntOrPtrTy() && !CTy->isFloatingPointTy())452    return nullptr;453 454  return C;455}456 457LoopIdiomRecognize::LegalStoreKind458LoopIdiomRecognize::isLegalStore(StoreInst *SI) {459  // Don't touch volatile stores.460  if (SI->isVolatile())461    return LegalStoreKind::None;462  // We only want simple or unordered-atomic stores.463  if (!SI->isUnordered())464    return LegalStoreKind::None;465 466  // Avoid merging nontemporal stores.467  if (SI->getMetadata(LLVMContext::MD_nontemporal))468    return LegalStoreKind::None;469 470  Value *StoredVal = SI->getValueOperand();471  Value *StorePtr = SI->getPointerOperand();472 473  // Don't convert stores of non-integral pointer types to memsets (which stores474  // integers).475  if (DL->isNonIntegralPointerType(StoredVal->getType()->getScalarType()))476    return LegalStoreKind::None;477 478  // Reject stores that are so large that they overflow an unsigned.479  // When storing out scalable vectors we bail out for now, since the code480  // below currently only works for constant strides.481  TypeSize SizeInBits = DL->getTypeSizeInBits(StoredVal->getType());482  if (SizeInBits.isScalable() || (SizeInBits.getFixedValue() & 7) ||483      (SizeInBits.getFixedValue() >> 32) != 0)484    return LegalStoreKind::None;485 486  // See if the pointer expression is an AddRec like {base,+,1} on the current487  // loop, which indicates a strided store.  If we have something else, it's a488  // random store we can't handle.489  const SCEV *StoreEv = SE->getSCEV(StorePtr);490  const SCEVConstant *Stride;491  if (!match(StoreEv, m_scev_AffineAddRec(m_SCEV(), m_SCEVConstant(Stride),492                                          m_SpecificLoop(CurLoop))))493    return LegalStoreKind::None;494 495  // See if the store can be turned into a memset.496 497  // If the stored value is a byte-wise value (like i32 -1), then it may be498  // turned into a memset of i8 -1, assuming that all the consecutive bytes499  // are stored.  A store of i32 0x01020304 can never be turned into a memset,500  // but it can be turned into memset_pattern if the target supports it.501  Value *SplatValue = isBytewiseValue(StoredVal, *DL);502 503  // Note: memset and memset_pattern on unordered-atomic is yet not supported504  bool UnorderedAtomic = SI->isUnordered() && !SI->isSimple();505 506  // If we're allowed to form a memset, and the stored value would be507  // acceptable for memset, use it.508  if (!UnorderedAtomic && HasMemset && SplatValue && !DisableLIRP::Memset &&509      // Verify that the stored value is loop invariant.  If not, we can't510      // promote the memset.511      CurLoop->isLoopInvariant(SplatValue)) {512    // It looks like we can use SplatValue.513    return LegalStoreKind::Memset;514  }515  if (!UnorderedAtomic && (HasMemsetPattern || ForceMemsetPatternIntrinsic) &&516      !DisableLIRP::Memset &&517      // Don't create memset_pattern16s with address spaces.518      StorePtr->getType()->getPointerAddressSpace() == 0 &&519      getMemSetPatternValue(StoredVal, DL)) {520    // It looks like we can use PatternValue!521    return LegalStoreKind::MemsetPattern;522  }523 524  // Otherwise, see if the store can be turned into a memcpy.525  if (HasMemcpy && !DisableLIRP::Memcpy) {526    // Check to see if the stride matches the size of the store.  If so, then we527    // know that every byte is touched in the loop.528    unsigned StoreSize = DL->getTypeStoreSize(SI->getValueOperand()->getType());529    APInt StrideAP = Stride->getAPInt();530    if (StoreSize != StrideAP && StoreSize != -StrideAP)531      return LegalStoreKind::None;532 533    // The store must be feeding a non-volatile load.534    LoadInst *LI = dyn_cast<LoadInst>(SI->getValueOperand());535 536    // Only allow non-volatile loads537    if (!LI || LI->isVolatile())538      return LegalStoreKind::None;539    // Only allow simple or unordered-atomic loads540    if (!LI->isUnordered())541      return LegalStoreKind::None;542 543    // See if the pointer expression is an AddRec like {base,+,1} on the current544    // loop, which indicates a strided load.  If we have something else, it's a545    // random load we can't handle.546    const SCEV *LoadEv = SE->getSCEV(LI->getPointerOperand());547 548    // The store and load must share the same stride.549    if (!match(LoadEv, m_scev_AffineAddRec(m_SCEV(), m_scev_Specific(Stride),550                                           m_SpecificLoop(CurLoop))))551      return LegalStoreKind::None;552 553    // Success.  This store can be converted into a memcpy.554    UnorderedAtomic = UnorderedAtomic || LI->isAtomic();555    return UnorderedAtomic ? LegalStoreKind::UnorderedAtomicMemcpy556                           : LegalStoreKind::Memcpy;557  }558  // This store can't be transformed into a memset/memcpy.559  return LegalStoreKind::None;560}561 562void LoopIdiomRecognize::collectStores(BasicBlock *BB) {563  StoreRefsForMemset.clear();564  StoreRefsForMemsetPattern.clear();565  StoreRefsForMemcpy.clear();566  for (Instruction &I : *BB) {567    StoreInst *SI = dyn_cast<StoreInst>(&I);568    if (!SI)569      continue;570 571    // Make sure this is a strided store with a constant stride.572    switch (isLegalStore(SI)) {573    case LegalStoreKind::None:574      // Nothing to do575      break;576    case LegalStoreKind::Memset: {577      // Find the base pointer.578      Value *Ptr = getUnderlyingObject(SI->getPointerOperand());579      StoreRefsForMemset[Ptr].push_back(SI);580    } break;581    case LegalStoreKind::MemsetPattern: {582      // Find the base pointer.583      Value *Ptr = getUnderlyingObject(SI->getPointerOperand());584      StoreRefsForMemsetPattern[Ptr].push_back(SI);585    } break;586    case LegalStoreKind::Memcpy:587    case LegalStoreKind::UnorderedAtomicMemcpy:588      StoreRefsForMemcpy.push_back(SI);589      break;590    default:591      assert(false && "unhandled return value");592      break;593    }594  }595}596 597/// runOnLoopBlock - Process the specified block, which lives in a counted loop598/// with the specified backedge count.  This block is known to be in the current599/// loop and not in any subloops.600bool LoopIdiomRecognize::runOnLoopBlock(601    BasicBlock *BB, const SCEV *BECount,602    SmallVectorImpl<BasicBlock *> &ExitBlocks) {603  // We can only promote stores in this block if they are unconditionally604  // executed in the loop.  For a block to be unconditionally executed, it has605  // to dominate all the exit blocks of the loop.  Verify this now.606  for (BasicBlock *ExitBlock : ExitBlocks)607    if (!DT->dominates(BB, ExitBlock))608      return false;609 610  bool MadeChange = false;611  // Look for store instructions, which may be optimized to memset/memcpy.612  collectStores(BB);613 614  // Look for a single store or sets of stores with a common base, which can be615  // optimized into a memset (memset_pattern).  The latter most commonly happens616  // with structs and handunrolled loops.617  for (auto &SL : StoreRefsForMemset)618    MadeChange |= processLoopStores(SL.second, BECount, ForMemset::Yes);619 620  for (auto &SL : StoreRefsForMemsetPattern)621    MadeChange |= processLoopStores(SL.second, BECount, ForMemset::No);622 623  // Optimize the store into a memcpy, if it feeds an similarly strided load.624  for (auto &SI : StoreRefsForMemcpy)625    MadeChange |= processLoopStoreOfLoopLoad(SI, BECount);626 627  MadeChange |= processLoopMemIntrinsic<MemCpyInst>(628      BB, &LoopIdiomRecognize::processLoopMemCpy, BECount);629  MadeChange |= processLoopMemIntrinsic<MemSetInst>(630      BB, &LoopIdiomRecognize::processLoopMemSet, BECount);631 632  return MadeChange;633}634 635/// See if this store(s) can be promoted to a memset.636bool LoopIdiomRecognize::processLoopStores(SmallVectorImpl<StoreInst *> &SL,637                                           const SCEV *BECount, ForMemset For) {638  // Try to find consecutive stores that can be transformed into memsets.639  SetVector<StoreInst *> Heads, Tails;640  SmallDenseMap<StoreInst *, StoreInst *> ConsecutiveChain;641 642  // Do a quadratic search on all of the given stores and find643  // all of the pairs of stores that follow each other.644  SmallVector<unsigned, 16> IndexQueue;645  for (unsigned i = 0, e = SL.size(); i < e; ++i) {646    assert(SL[i]->isSimple() && "Expected only non-volatile stores.");647 648    Value *FirstStoredVal = SL[i]->getValueOperand();649    Value *FirstStorePtr = SL[i]->getPointerOperand();650    const SCEVAddRecExpr *FirstStoreEv =651        cast<SCEVAddRecExpr>(SE->getSCEV(FirstStorePtr));652    APInt FirstStride = getStoreStride(FirstStoreEv);653    unsigned FirstStoreSize = DL->getTypeStoreSize(SL[i]->getValueOperand()->getType());654 655    // See if we can optimize just this store in isolation.656    if (FirstStride == FirstStoreSize || -FirstStride == FirstStoreSize) {657      Heads.insert(SL[i]);658      continue;659    }660 661    Value *FirstSplatValue = nullptr;662    Constant *FirstPatternValue = nullptr;663 664    if (For == ForMemset::Yes)665      FirstSplatValue = isBytewiseValue(FirstStoredVal, *DL);666    else667      FirstPatternValue = getMemSetPatternValue(FirstStoredVal, DL);668 669    assert((FirstSplatValue || FirstPatternValue) &&670           "Expected either splat value or pattern value.");671 672    IndexQueue.clear();673    // If a store has multiple consecutive store candidates, search Stores674    // array according to the sequence: from i+1 to e, then from i-1 to 0.675    // This is because usually pairing with immediate succeeding or preceding676    // candidate create the best chance to find memset opportunity.677    unsigned j = 0;678    for (j = i + 1; j < e; ++j)679      IndexQueue.push_back(j);680    for (j = i; j > 0; --j)681      IndexQueue.push_back(j - 1);682 683    for (auto &k : IndexQueue) {684      assert(SL[k]->isSimple() && "Expected only non-volatile stores.");685      Value *SecondStorePtr = SL[k]->getPointerOperand();686      const SCEVAddRecExpr *SecondStoreEv =687          cast<SCEVAddRecExpr>(SE->getSCEV(SecondStorePtr));688      APInt SecondStride = getStoreStride(SecondStoreEv);689 690      if (FirstStride != SecondStride)691        continue;692 693      Value *SecondStoredVal = SL[k]->getValueOperand();694      Value *SecondSplatValue = nullptr;695      Constant *SecondPatternValue = nullptr;696 697      if (For == ForMemset::Yes)698        SecondSplatValue = isBytewiseValue(SecondStoredVal, *DL);699      else700        SecondPatternValue = getMemSetPatternValue(SecondStoredVal, DL);701 702      assert((SecondSplatValue || SecondPatternValue) &&703             "Expected either splat value or pattern value.");704 705      if (isConsecutiveAccess(SL[i], SL[k], *DL, *SE, false)) {706        if (For == ForMemset::Yes) {707          if (isa<UndefValue>(FirstSplatValue))708            FirstSplatValue = SecondSplatValue;709          if (FirstSplatValue != SecondSplatValue)710            continue;711        } else {712          if (isa<UndefValue>(FirstPatternValue))713            FirstPatternValue = SecondPatternValue;714          if (FirstPatternValue != SecondPatternValue)715            continue;716        }717        Tails.insert(SL[k]);718        Heads.insert(SL[i]);719        ConsecutiveChain[SL[i]] = SL[k];720        break;721      }722    }723  }724 725  // We may run into multiple chains that merge into a single chain. We mark the726  // stores that we transformed so that we don't visit the same store twice.727  SmallPtrSet<Value *, 16> TransformedStores;728  bool Changed = false;729 730  // For stores that start but don't end a link in the chain:731  for (StoreInst *I : Heads) {732    if (Tails.count(I))733      continue;734 735    // We found a store instr that starts a chain. Now follow the chain and try736    // to transform it.737    SmallPtrSet<Instruction *, 8> AdjacentStores;738    StoreInst *HeadStore = I;739    unsigned StoreSize = 0;740 741    // Collect the chain into a list.742    while (Tails.count(I) || Heads.count(I)) {743      if (TransformedStores.count(I))744        break;745      AdjacentStores.insert(I);746 747      StoreSize += DL->getTypeStoreSize(I->getValueOperand()->getType());748      // Move to the next value in the chain.749      I = ConsecutiveChain[I];750    }751 752    Value *StoredVal = HeadStore->getValueOperand();753    Value *StorePtr = HeadStore->getPointerOperand();754    const SCEVAddRecExpr *StoreEv = cast<SCEVAddRecExpr>(SE->getSCEV(StorePtr));755    APInt Stride = getStoreStride(StoreEv);756 757    // Check to see if the stride matches the size of the stores.  If so, then758    // we know that every byte is touched in the loop.759    if (StoreSize != Stride && StoreSize != -Stride)760      continue;761 762    bool IsNegStride = StoreSize == -Stride;763 764    Type *IntIdxTy = DL->getIndexType(StorePtr->getType());765    const SCEV *StoreSizeSCEV = SE->getConstant(IntIdxTy, StoreSize);766    if (processLoopStridedStore(StorePtr, StoreSizeSCEV,767                                MaybeAlign(HeadStore->getAlign()), StoredVal,768                                HeadStore, AdjacentStores, StoreEv, BECount,769                                IsNegStride)) {770      TransformedStores.insert_range(AdjacentStores);771      Changed = true;772    }773  }774 775  return Changed;776}777 778/// processLoopMemIntrinsic - Template function for calling different processor779/// functions based on mem intrinsic type.780template <typename MemInst>781bool LoopIdiomRecognize::processLoopMemIntrinsic(782    BasicBlock *BB,783    bool (LoopIdiomRecognize::*Processor)(MemInst *, const SCEV *),784    const SCEV *BECount) {785  bool MadeChange = false;786  for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E;) {787    Instruction *Inst = &*I++;788    // Look for memory instructions, which may be optimized to a larger one.789    if (MemInst *MI = dyn_cast<MemInst>(Inst)) {790      WeakTrackingVH InstPtr(&*I);791      if (!(this->*Processor)(MI, BECount))792        continue;793      MadeChange = true;794 795      // If processing the instruction invalidated our iterator, start over from796      // the top of the block.797      if (!InstPtr)798        I = BB->begin();799    }800  }801  return MadeChange;802}803 804/// processLoopMemCpy - See if this memcpy can be promoted to a large memcpy805bool LoopIdiomRecognize::processLoopMemCpy(MemCpyInst *MCI,806                                           const SCEV *BECount) {807  // We can only handle non-volatile memcpys with a constant size.808  if (MCI->isVolatile() || !isa<ConstantInt>(MCI->getLength()))809    return false;810 811  // If we're not allowed to hack on memcpy, we fail.812  if ((!HasMemcpy && !MCI->isForceInlined()) || DisableLIRP::Memcpy)813    return false;814 815  Value *Dest = MCI->getDest();816  Value *Source = MCI->getSource();817  if (!Dest || !Source)818    return false;819 820  // See if the load and store pointer expressions are AddRec like {base,+,1} on821  // the current loop, which indicates a strided load and store.  If we have822  // something else, it's a random load or store we can't handle.823  const SCEV *StoreEv = SE->getSCEV(Dest);824  const SCEV *LoadEv = SE->getSCEV(Source);825  const APInt *StoreStrideValue, *LoadStrideValue;826  if (!match(StoreEv,827             m_scev_AffineAddRec(m_SCEV(), m_scev_APInt(StoreStrideValue),828                                 m_SpecificLoop(CurLoop))) ||829      !match(LoadEv,830             m_scev_AffineAddRec(m_SCEV(), m_scev_APInt(LoadStrideValue),831                                 m_SpecificLoop(CurLoop))))832    return false;833 834  // Reject memcpys that are so large that they overflow an unsigned.835  uint64_t SizeInBytes = cast<ConstantInt>(MCI->getLength())->getZExtValue();836  if ((SizeInBytes >> 32) != 0)837    return false;838 839  // Huge stride value - give up840  if (StoreStrideValue->getBitWidth() > 64 ||841      LoadStrideValue->getBitWidth() > 64)842    return false;843 844  if (SizeInBytes != *StoreStrideValue && SizeInBytes != -*StoreStrideValue) {845    ORE.emit([&]() {846      return OptimizationRemarkMissed(DEBUG_TYPE, "SizeStrideUnequal", MCI)847             << ore::NV("Inst", "memcpy") << " in "848             << ore::NV("Function", MCI->getFunction())849             << " function will not be hoisted: "850             << ore::NV("Reason", "memcpy size is not equal to stride");851    });852    return false;853  }854 855  int64_t StoreStrideInt = StoreStrideValue->getSExtValue();856  int64_t LoadStrideInt = LoadStrideValue->getSExtValue();857  // Check if the load stride matches the store stride.858  if (StoreStrideInt != LoadStrideInt)859    return false;860 861  return processLoopStoreOfLoopLoad(862      Dest, Source, SE->getConstant(Dest->getType(), SizeInBytes),863      MCI->getDestAlign(), MCI->getSourceAlign(), MCI, MCI,864      cast<SCEVAddRecExpr>(StoreEv), cast<SCEVAddRecExpr>(LoadEv), BECount);865}866 867/// processLoopMemSet - See if this memset can be promoted to a large memset.868bool LoopIdiomRecognize::processLoopMemSet(MemSetInst *MSI,869                                           const SCEV *BECount) {870  // We can only handle non-volatile memsets.871  if (MSI->isVolatile())872    return false;873 874  // If we're not allowed to hack on memset, we fail.875  if (!HasMemset || DisableLIRP::Memset)876    return false;877 878  Value *Pointer = MSI->getDest();879 880  // See if the pointer expression is an AddRec like {base,+,1} on the current881  // loop, which indicates a strided store.  If we have something else, it's a882  // random store we can't handle.883  const SCEV *Ev = SE->getSCEV(Pointer);884  const SCEV *PointerStrideSCEV;885  if (!match(Ev, m_scev_AffineAddRec(m_SCEV(), m_SCEV(PointerStrideSCEV),886                                     m_SpecificLoop(CurLoop)))) {887    LLVM_DEBUG(dbgs() << "  Pointer is not affine, abort\n");888    return false;889  }890 891  const SCEV *MemsetSizeSCEV = SE->getSCEV(MSI->getLength());892 893  bool IsNegStride = false;894  const bool IsConstantSize = isa<ConstantInt>(MSI->getLength());895 896  if (IsConstantSize) {897    // Memset size is constant.898    // Check if the pointer stride matches the memset size. If so, then899    // we know that every byte is touched in the loop.900    LLVM_DEBUG(dbgs() << "  memset size is constant\n");901    uint64_t SizeInBytes = cast<ConstantInt>(MSI->getLength())->getZExtValue();902    const APInt *Stride;903    if (!match(PointerStrideSCEV, m_scev_APInt(Stride)))904      return false;905 906    if (SizeInBytes != *Stride && SizeInBytes != -*Stride)907      return false;908 909    IsNegStride = SizeInBytes == -*Stride;910  } else {911    // Memset size is non-constant.912    // Check if the pointer stride matches the memset size.913    // To be conservative, the pass would not promote pointers that aren't in914    // address space zero. Also, the pass only handles memset length and stride915    // that are invariant for the top level loop.916    LLVM_DEBUG(dbgs() << "  memset size is non-constant\n");917    if (Pointer->getType()->getPointerAddressSpace() != 0) {918      LLVM_DEBUG(dbgs() << "  pointer is not in address space zero, "919                        << "abort\n");920      return false;921    }922    if (!SE->isLoopInvariant(MemsetSizeSCEV, CurLoop)) {923      LLVM_DEBUG(dbgs() << "  memset size is not a loop-invariant, "924                        << "abort\n");925      return false;926    }927 928    // Compare positive direction PointerStrideSCEV with MemsetSizeSCEV929    IsNegStride = PointerStrideSCEV->isNonConstantNegative();930    const SCEV *PositiveStrideSCEV =931        IsNegStride ? SE->getNegativeSCEV(PointerStrideSCEV)932                    : PointerStrideSCEV;933    LLVM_DEBUG(dbgs() << "  MemsetSizeSCEV: " << *MemsetSizeSCEV << "\n"934                      << "  PositiveStrideSCEV: " << *PositiveStrideSCEV935                      << "\n");936 937    if (PositiveStrideSCEV != MemsetSizeSCEV) {938      // If an expression is covered by the loop guard, compare again and939      // proceed with optimization if equal.940      const SCEV *FoldedPositiveStride =941          SE->applyLoopGuards(PositiveStrideSCEV, CurLoop);942      const SCEV *FoldedMemsetSize =943          SE->applyLoopGuards(MemsetSizeSCEV, CurLoop);944 945      LLVM_DEBUG(dbgs() << "  Try to fold SCEV based on loop guard\n"946                        << "    FoldedMemsetSize: " << *FoldedMemsetSize << "\n"947                        << "    FoldedPositiveStride: " << *FoldedPositiveStride948                        << "\n");949 950      if (FoldedPositiveStride != FoldedMemsetSize) {951        LLVM_DEBUG(dbgs() << "  SCEV don't match, abort\n");952        return false;953      }954    }955  }956 957  // Verify that the memset value is loop invariant.  If not, we can't promote958  // the memset.959  Value *SplatValue = MSI->getValue();960  if (!SplatValue || !CurLoop->isLoopInvariant(SplatValue))961    return false;962 963  SmallPtrSet<Instruction *, 1> MSIs;964  MSIs.insert(MSI);965  return processLoopStridedStore(Pointer, SE->getSCEV(MSI->getLength()),966                                 MSI->getDestAlign(), SplatValue, MSI, MSIs,967                                 cast<SCEVAddRecExpr>(Ev), BECount, IsNegStride,968                                 /*IsLoopMemset=*/true);969}970 971/// mayLoopAccessLocation - Return true if the specified loop might access the972/// specified pointer location, which is a loop-strided access.  The 'Access'973/// argument specifies what the verboten forms of access are (read or write).974static bool975mayLoopAccessLocation(Value *Ptr, ModRefInfo Access, Loop *L,976                      const SCEV *BECount, const SCEV *StoreSizeSCEV,977                      AliasAnalysis &AA,978                      SmallPtrSetImpl<Instruction *> &IgnoredInsts) {979  // Get the location that may be stored across the loop.  Since the access is980  // strided positively through memory, we say that the modified location starts981  // at the pointer and has infinite size.982  LocationSize AccessSize = LocationSize::afterPointer();983 984  // If the loop iterates a fixed number of times, we can refine the access size985  // to be exactly the size of the memset, which is (BECount+1)*StoreSize986  const APInt *BECst, *ConstSize;987  if (match(BECount, m_scev_APInt(BECst)) &&988      match(StoreSizeSCEV, m_scev_APInt(ConstSize))) {989    std::optional<uint64_t> BEInt = BECst->tryZExtValue();990    std::optional<uint64_t> SizeInt = ConstSize->tryZExtValue();991    // FIXME: Should this check for overflow?992    if (BEInt && SizeInt)993      AccessSize = LocationSize::precise((*BEInt + 1) * *SizeInt);994  }995 996  // TODO: For this to be really effective, we have to dive into the pointer997  // operand in the store.  Store to &A[i] of 100 will always return may alias998  // with store of &A[100], we need to StoreLoc to be "A" with size of 100,999  // which will then no-alias a store to &A[100].1000  MemoryLocation StoreLoc(Ptr, AccessSize);1001 1002  for (BasicBlock *B : L->blocks())1003    for (Instruction &I : *B)1004      if (!IgnoredInsts.contains(&I) &&1005          isModOrRefSet(AA.getModRefInfo(&I, StoreLoc) & Access))1006        return true;1007  return false;1008}1009 1010// If we have a negative stride, Start refers to the end of the memory location1011// we're trying to memset.  Therefore, we need to recompute the base pointer,1012// which is just Start - BECount*Size.1013static const SCEV *getStartForNegStride(const SCEV *Start, const SCEV *BECount,1014                                        Type *IntPtr, const SCEV *StoreSizeSCEV,1015                                        ScalarEvolution *SE) {1016  const SCEV *Index = SE->getTruncateOrZeroExtend(BECount, IntPtr);1017  if (!StoreSizeSCEV->isOne()) {1018    // index = back edge count * store size1019    Index = SE->getMulExpr(Index,1020                           SE->getTruncateOrZeroExtend(StoreSizeSCEV, IntPtr),1021                           SCEV::FlagNUW);1022  }1023  // base pointer = start - index * store size1024  return SE->getMinusSCEV(Start, Index);1025}1026 1027/// Compute the number of bytes as a SCEV from the backedge taken count.1028///1029/// This also maps the SCEV into the provided type and tries to handle the1030/// computation in a way that will fold cleanly.1031static const SCEV *getNumBytes(const SCEV *BECount, Type *IntPtr,1032                               const SCEV *StoreSizeSCEV, Loop *CurLoop,1033                               const DataLayout *DL, ScalarEvolution *SE) {1034  const SCEV *TripCountSCEV =1035      SE->getTripCountFromExitCount(BECount, IntPtr, CurLoop);1036  return SE->getMulExpr(TripCountSCEV,1037                        SE->getTruncateOrZeroExtend(StoreSizeSCEV, IntPtr),1038                        SCEV::FlagNUW);1039}1040 1041/// processLoopStridedStore - We see a strided store of some value.  If we can1042/// transform this into a memset or memset_pattern in the loop preheader, do so.1043bool LoopIdiomRecognize::processLoopStridedStore(1044    Value *DestPtr, const SCEV *StoreSizeSCEV, MaybeAlign StoreAlignment,1045    Value *StoredVal, Instruction *TheStore,1046    SmallPtrSetImpl<Instruction *> &Stores, const SCEVAddRecExpr *Ev,1047    const SCEV *BECount, bool IsNegStride, bool IsLoopMemset) {1048  Module *M = TheStore->getModule();1049 1050  // The trip count of the loop and the base pointer of the addrec SCEV is1051  // guaranteed to be loop invariant, which means that it should dominate the1052  // header.  This allows us to insert code for it in the preheader.1053  unsigned DestAS = DestPtr->getType()->getPointerAddressSpace();1054  BasicBlock *Preheader = CurLoop->getLoopPreheader();1055  IRBuilder<> Builder(Preheader->getTerminator());1056  SCEVExpander Expander(*SE, *DL, "loop-idiom");1057  SCEVExpanderCleaner ExpCleaner(Expander);1058 1059  Type *DestInt8PtrTy = Builder.getPtrTy(DestAS);1060  Type *IntIdxTy = DL->getIndexType(DestPtr->getType());1061 1062  bool Changed = false;1063  const SCEV *Start = Ev->getStart();1064  // Handle negative strided loops.1065  if (IsNegStride)1066    Start = getStartForNegStride(Start, BECount, IntIdxTy, StoreSizeSCEV, SE);1067 1068  // TODO: ideally we should still be able to generate memset if SCEV expander1069  // is taught to generate the dependencies at the latest point.1070  if (!Expander.isSafeToExpand(Start))1071    return Changed;1072 1073  // Okay, we have a strided store "p[i]" of a splattable value.  We can turn1074  // this into a memset in the loop preheader now if we want.  However, this1075  // would be unsafe to do if there is anything else in the loop that may read1076  // or write to the aliased location.  Check for any overlap by generating the1077  // base pointer and checking the region.1078  Value *BasePtr =1079      Expander.expandCodeFor(Start, DestInt8PtrTy, Preheader->getTerminator());1080 1081  // From here on out, conservatively report to the pass manager that we've1082  // changed the IR, even if we later clean up these added instructions. There1083  // may be structural differences e.g. in the order of use lists not accounted1084  // for in just a textual dump of the IR. This is written as a variable, even1085  // though statically all the places this dominates could be replaced with1086  // 'true', with the hope that anyone trying to be clever / "more precise" with1087  // the return value will read this comment, and leave them alone.1088  Changed = true;1089 1090  if (mayLoopAccessLocation(BasePtr, ModRefInfo::ModRef, CurLoop, BECount,1091                            StoreSizeSCEV, *AA, Stores))1092    return Changed;1093 1094  if (avoidLIRForMultiBlockLoop(/*IsMemset=*/true, IsLoopMemset))1095    return Changed;1096 1097  // Okay, everything looks good, insert the memset.1098  Value *SplatValue = isBytewiseValue(StoredVal, *DL);1099  Constant *PatternValue = nullptr;1100  if (!SplatValue)1101    PatternValue = getMemSetPatternValue(StoredVal, DL);1102 1103  // MemsetArg is the number of bytes for the memset libcall, and the number1104  // of pattern repetitions if the memset.pattern intrinsic is being used.1105  Value *MemsetArg;1106  std::optional<int64_t> BytesWritten;1107 1108  if (PatternValue && (HasMemsetPattern || ForceMemsetPatternIntrinsic)) {1109    const SCEV *TripCountS =1110        SE->getTripCountFromExitCount(BECount, IntIdxTy, CurLoop);1111    if (!Expander.isSafeToExpand(TripCountS))1112      return Changed;1113    const SCEVConstant *ConstStoreSize = dyn_cast<SCEVConstant>(StoreSizeSCEV);1114    if (!ConstStoreSize)1115      return Changed;1116    Value *TripCount = Expander.expandCodeFor(TripCountS, IntIdxTy,1117                                              Preheader->getTerminator());1118    uint64_t PatternRepsPerTrip =1119        (ConstStoreSize->getValue()->getZExtValue() * 8) /1120        DL->getTypeSizeInBits(PatternValue->getType());1121    // If ConstStoreSize is not equal to the width of PatternValue, then1122    // MemsetArg is TripCount * (ConstStoreSize/PatternValueWidth). Else1123    // MemSetArg is just TripCount.1124    MemsetArg =1125        PatternRepsPerTrip == 11126            ? TripCount1127            : Builder.CreateMul(TripCount,1128                                Builder.getIntN(IntIdxTy->getIntegerBitWidth(),1129                                                PatternRepsPerTrip));1130    if (auto *CI = dyn_cast<ConstantInt>(TripCount))1131      BytesWritten =1132          CI->getZExtValue() * ConstStoreSize->getValue()->getZExtValue();1133 1134  } else {1135    const SCEV *NumBytesS =1136        getNumBytes(BECount, IntIdxTy, StoreSizeSCEV, CurLoop, DL, SE);1137 1138    // TODO: ideally we should still be able to generate memset if SCEV expander1139    // is taught to generate the dependencies at the latest point.1140    if (!Expander.isSafeToExpand(NumBytesS))1141      return Changed;1142    MemsetArg =1143        Expander.expandCodeFor(NumBytesS, IntIdxTy, Preheader->getTerminator());1144    if (auto *CI = dyn_cast<ConstantInt>(MemsetArg))1145      BytesWritten = CI->getZExtValue();1146  }1147  assert(MemsetArg && "MemsetArg should have been set");1148 1149  AAMDNodes AATags = TheStore->getAAMetadata();1150  for (Instruction *Store : Stores)1151    AATags = AATags.merge(Store->getAAMetadata());1152  if (BytesWritten)1153    AATags = AATags.extendTo(BytesWritten.value());1154  else1155    AATags = AATags.extendTo(-1);1156 1157  CallInst *NewCall;1158  if (SplatValue) {1159    NewCall = Builder.CreateMemSet(BasePtr, SplatValue, MemsetArg,1160                                   MaybeAlign(StoreAlignment),1161                                   /*isVolatile=*/false, AATags);1162  } else if (ForceMemsetPatternIntrinsic ||1163             isLibFuncEmittable(M, TLI, LibFunc_memset_pattern16)) {1164    assert(isa<SCEVConstant>(StoreSizeSCEV) && "Expected constant store size");1165 1166    NewCall = Builder.CreateIntrinsic(1167        Intrinsic::experimental_memset_pattern,1168        {DestInt8PtrTy, PatternValue->getType(), IntIdxTy},1169        {BasePtr, PatternValue, MemsetArg,1170         ConstantInt::getFalse(M->getContext())});1171    if (StoreAlignment)1172      cast<MemSetPatternInst>(NewCall)->setDestAlignment(*StoreAlignment);1173    NewCall->setAAMetadata(AATags);1174  } else {1175    // Neither a memset, nor memset_pattern161176    return Changed;1177  }1178 1179  NewCall->setDebugLoc(TheStore->getDebugLoc());1180 1181  if (MSSAU) {1182    MemoryAccess *NewMemAcc = MSSAU->createMemoryAccessInBB(1183        NewCall, nullptr, NewCall->getParent(), MemorySSA::BeforeTerminator);1184    MSSAU->insertDef(cast<MemoryDef>(NewMemAcc), true);1185  }1186 1187  LLVM_DEBUG(dbgs() << "  Formed memset: " << *NewCall << "\n"1188                    << "    from store to: " << *Ev << " at: " << *TheStore1189                    << "\n");1190 1191  ORE.emit([&]() {1192    OptimizationRemark R(DEBUG_TYPE, "ProcessLoopStridedStore",1193                         NewCall->getDebugLoc(), Preheader);1194    R << "Transformed loop-strided store in "1195      << ore::NV("Function", TheStore->getFunction())1196      << " function into a call to "1197      << ore::NV("NewFunction", NewCall->getCalledFunction())1198      << "() intrinsic";1199    if (!Stores.empty())1200      R << ore::setExtraArgs();1201    for (auto *I : Stores) {1202      R << ore::NV("FromBlock", I->getParent()->getName())1203        << ore::NV("ToBlock", Preheader->getName());1204    }1205    return R;1206  });1207 1208  // Okay, the memset has been formed.  Zap the original store and anything that1209  // feeds into it.1210  for (auto *I : Stores) {1211    if (MSSAU)1212      MSSAU->removeMemoryAccess(I, true);1213    deleteDeadInstruction(I);1214  }1215  if (MSSAU && VerifyMemorySSA)1216    MSSAU->getMemorySSA()->verifyMemorySSA();1217  ++NumMemSet;1218  ExpCleaner.markResultUsed();1219  return true;1220}1221 1222/// If the stored value is a strided load in the same loop with the same stride1223/// this may be transformable into a memcpy.  This kicks in for stuff like1224/// for (i) A[i] = B[i];1225bool LoopIdiomRecognize::processLoopStoreOfLoopLoad(StoreInst *SI,1226                                                    const SCEV *BECount) {1227  assert(SI->isUnordered() && "Expected only non-volatile non-ordered stores.");1228 1229  Value *StorePtr = SI->getPointerOperand();1230  const SCEVAddRecExpr *StoreEv = cast<SCEVAddRecExpr>(SE->getSCEV(StorePtr));1231  unsigned StoreSize = DL->getTypeStoreSize(SI->getValueOperand()->getType());1232 1233  // The store must be feeding a non-volatile load.1234  LoadInst *LI = cast<LoadInst>(SI->getValueOperand());1235  assert(LI->isUnordered() && "Expected only non-volatile non-ordered loads.");1236 1237  // See if the pointer expression is an AddRec like {base,+,1} on the current1238  // loop, which indicates a strided load.  If we have something else, it's a1239  // random load we can't handle.1240  Value *LoadPtr = LI->getPointerOperand();1241  const SCEVAddRecExpr *LoadEv = cast<SCEVAddRecExpr>(SE->getSCEV(LoadPtr));1242 1243  const SCEV *StoreSizeSCEV = SE->getConstant(StorePtr->getType(), StoreSize);1244  return processLoopStoreOfLoopLoad(StorePtr, LoadPtr, StoreSizeSCEV,1245                                    SI->getAlign(), LI->getAlign(), SI, LI,1246                                    StoreEv, LoadEv, BECount);1247}1248 1249namespace {1250class MemmoveVerifier {1251public:1252  explicit MemmoveVerifier(const Value &LoadBasePtr, const Value &StoreBasePtr,1253                           const DataLayout &DL)1254      : DL(DL), BP1(llvm::GetPointerBaseWithConstantOffset(1255                    LoadBasePtr.stripPointerCasts(), LoadOff, DL)),1256        BP2(llvm::GetPointerBaseWithConstantOffset(1257            StoreBasePtr.stripPointerCasts(), StoreOff, DL)),1258        IsSameObject(BP1 == BP2) {}1259 1260  bool loadAndStoreMayFormMemmove(unsigned StoreSize, bool IsNegStride,1261                                  const Instruction &TheLoad,1262                                  bool IsMemCpy) const {1263    if (IsMemCpy) {1264      // Ensure that LoadBasePtr is after StoreBasePtr or before StoreBasePtr1265      // for negative stride.1266      if ((!IsNegStride && LoadOff <= StoreOff) ||1267          (IsNegStride && LoadOff >= StoreOff))1268        return false;1269    } else {1270      // Ensure that LoadBasePtr is after StoreBasePtr or before StoreBasePtr1271      // for negative stride. LoadBasePtr shouldn't overlap with StoreBasePtr.1272      int64_t LoadSize =1273          DL.getTypeSizeInBits(TheLoad.getType()).getFixedValue() / 8;1274      if (BP1 != BP2 || LoadSize != int64_t(StoreSize))1275        return false;1276      if ((!IsNegStride && LoadOff < StoreOff + int64_t(StoreSize)) ||1277          (IsNegStride && LoadOff + LoadSize > StoreOff))1278        return false;1279    }1280    return true;1281  }1282 1283private:1284  const DataLayout &DL;1285  int64_t LoadOff = 0;1286  int64_t StoreOff = 0;1287  const Value *BP1;1288  const Value *BP2;1289 1290public:1291  const bool IsSameObject;1292};1293} // namespace1294 1295bool LoopIdiomRecognize::processLoopStoreOfLoopLoad(1296    Value *DestPtr, Value *SourcePtr, const SCEV *StoreSizeSCEV,1297    MaybeAlign StoreAlign, MaybeAlign LoadAlign, Instruction *TheStore,1298    Instruction *TheLoad, const SCEVAddRecExpr *StoreEv,1299    const SCEVAddRecExpr *LoadEv, const SCEV *BECount) {1300 1301  // FIXME: until llvm.memcpy.inline supports dynamic sizes, we need to1302  // conservatively bail here, since otherwise we may have to transform1303  // llvm.memcpy.inline into llvm.memcpy which is illegal.1304  if (auto *MCI = dyn_cast<MemCpyInst>(TheStore); MCI && MCI->isForceInlined())1305    return false;1306 1307  // The trip count of the loop and the base pointer of the addrec SCEV is1308  // guaranteed to be loop invariant, which means that it should dominate the1309  // header.  This allows us to insert code for it in the preheader.1310  BasicBlock *Preheader = CurLoop->getLoopPreheader();1311  IRBuilder<> Builder(Preheader->getTerminator());1312  SCEVExpander Expander(*SE, *DL, "loop-idiom");1313 1314  SCEVExpanderCleaner ExpCleaner(Expander);1315 1316  bool Changed = false;1317  const SCEV *StrStart = StoreEv->getStart();1318  unsigned StrAS = DestPtr->getType()->getPointerAddressSpace();1319  Type *IntIdxTy = Builder.getIntNTy(DL->getIndexSizeInBits(StrAS));1320 1321  APInt Stride = getStoreStride(StoreEv);1322  const SCEVConstant *ConstStoreSize = dyn_cast<SCEVConstant>(StoreSizeSCEV);1323 1324  // TODO: Deal with non-constant size; Currently expect constant store size1325  assert(ConstStoreSize && "store size is expected to be a constant");1326 1327  int64_t StoreSize = ConstStoreSize->getValue()->getZExtValue();1328  bool IsNegStride = StoreSize == -Stride;1329 1330  // Handle negative strided loops.1331  if (IsNegStride)1332    StrStart =1333        getStartForNegStride(StrStart, BECount, IntIdxTy, StoreSizeSCEV, SE);1334 1335  // Okay, we have a strided store "p[i]" of a loaded value.  We can turn1336  // this into a memcpy in the loop preheader now if we want.  However, this1337  // would be unsafe to do if there is anything else in the loop that may read1338  // or write the memory region we're storing to.  This includes the load that1339  // feeds the stores.  Check for an alias by generating the base address and1340  // checking everything.1341  Value *StoreBasePtr = Expander.expandCodeFor(1342      StrStart, Builder.getPtrTy(StrAS), Preheader->getTerminator());1343 1344  // From here on out, conservatively report to the pass manager that we've1345  // changed the IR, even if we later clean up these added instructions. There1346  // may be structural differences e.g. in the order of use lists not accounted1347  // for in just a textual dump of the IR. This is written as a variable, even1348  // though statically all the places this dominates could be replaced with1349  // 'true', with the hope that anyone trying to be clever / "more precise" with1350  // the return value will read this comment, and leave them alone.1351  Changed = true;1352 1353  SmallPtrSet<Instruction *, 2> IgnoredInsts;1354  IgnoredInsts.insert(TheStore);1355 1356  bool IsMemCpy = isa<MemCpyInst>(TheStore);1357  const StringRef InstRemark = IsMemCpy ? "memcpy" : "load and store";1358 1359  bool LoopAccessStore =1360      mayLoopAccessLocation(StoreBasePtr, ModRefInfo::ModRef, CurLoop, BECount,1361                            StoreSizeSCEV, *AA, IgnoredInsts);1362  if (LoopAccessStore) {1363    // For memmove case it's not enough to guarantee that loop doesn't access1364    // TheStore and TheLoad. Additionally we need to make sure that TheStore is1365    // the only user of TheLoad.1366    if (!TheLoad->hasOneUse())1367      return Changed;1368    IgnoredInsts.insert(TheLoad);1369    if (mayLoopAccessLocation(StoreBasePtr, ModRefInfo::ModRef, CurLoop,1370                              BECount, StoreSizeSCEV, *AA, IgnoredInsts)) {1371      ORE.emit([&]() {1372        return OptimizationRemarkMissed(DEBUG_TYPE, "LoopMayAccessStore",1373                                        TheStore)1374               << ore::NV("Inst", InstRemark) << " in "1375               << ore::NV("Function", TheStore->getFunction())1376               << " function will not be hoisted: "1377               << ore::NV("Reason", "The loop may access store location");1378      });1379      return Changed;1380    }1381    IgnoredInsts.erase(TheLoad);1382  }1383 1384  const SCEV *LdStart = LoadEv->getStart();1385  unsigned LdAS = SourcePtr->getType()->getPointerAddressSpace();1386 1387  // Handle negative strided loops.1388  if (IsNegStride)1389    LdStart =1390        getStartForNegStride(LdStart, BECount, IntIdxTy, StoreSizeSCEV, SE);1391 1392  // For a memcpy, we have to make sure that the input array is not being1393  // mutated by the loop.1394  Value *LoadBasePtr = Expander.expandCodeFor(LdStart, Builder.getPtrTy(LdAS),1395                                              Preheader->getTerminator());1396 1397  // If the store is a memcpy instruction, we must check if it will write to1398  // the load memory locations. So remove it from the ignored stores.1399  MemmoveVerifier Verifier(*LoadBasePtr, *StoreBasePtr, *DL);1400  if (IsMemCpy && !Verifier.IsSameObject)1401    IgnoredInsts.erase(TheStore);1402  if (mayLoopAccessLocation(LoadBasePtr, ModRefInfo::Mod, CurLoop, BECount,1403                            StoreSizeSCEV, *AA, IgnoredInsts)) {1404    ORE.emit([&]() {1405      return OptimizationRemarkMissed(DEBUG_TYPE, "LoopMayAccessLoad", TheLoad)1406             << ore::NV("Inst", InstRemark) << " in "1407             << ore::NV("Function", TheStore->getFunction())1408             << " function will not be hoisted: "1409             << ore::NV("Reason", "The loop may access load location");1410    });1411    return Changed;1412  }1413 1414  bool IsAtomic = TheStore->isAtomic() || TheLoad->isAtomic();1415  bool UseMemMove = IsMemCpy ? Verifier.IsSameObject : LoopAccessStore;1416 1417  if (IsAtomic) {1418    // For now don't support unordered atomic memmove.1419    if (UseMemMove)1420      return Changed;1421 1422    // We cannot allow unaligned ops for unordered load/store, so reject1423    // anything where the alignment isn't at least the element size.1424    assert((StoreAlign && LoadAlign) &&1425           "Expect unordered load/store to have align.");1426    if (*StoreAlign < StoreSize || *LoadAlign < StoreSize)1427      return Changed;1428 1429    // If the element.atomic memcpy is not lowered into explicit1430    // loads/stores later, then it will be lowered into an element-size1431    // specific lib call. If the lib call doesn't exist for our store size, then1432    // we shouldn't generate the memcpy.1433    if (StoreSize > TTI->getAtomicMemIntrinsicMaxElementSize())1434      return Changed;1435  }1436 1437  if (UseMemMove)1438    if (!Verifier.loadAndStoreMayFormMemmove(StoreSize, IsNegStride, *TheLoad,1439                                             IsMemCpy))1440      return Changed;1441 1442  if (avoidLIRForMultiBlockLoop())1443    return Changed;1444 1445  // Okay, everything is safe, we can transform this!1446 1447  const SCEV *NumBytesS =1448      getNumBytes(BECount, IntIdxTy, StoreSizeSCEV, CurLoop, DL, SE);1449 1450  Value *NumBytes =1451      Expander.expandCodeFor(NumBytesS, IntIdxTy, Preheader->getTerminator());1452 1453  AAMDNodes AATags = TheLoad->getAAMetadata();1454  AAMDNodes StoreAATags = TheStore->getAAMetadata();1455  AATags = AATags.merge(StoreAATags);1456  if (auto CI = dyn_cast<ConstantInt>(NumBytes))1457    AATags = AATags.extendTo(CI->getZExtValue());1458  else1459    AATags = AATags.extendTo(-1);1460 1461  CallInst *NewCall = nullptr;1462  // Check whether to generate an unordered atomic memcpy:1463  //  If the load or store are atomic, then they must necessarily be unordered1464  //  by previous checks.1465  if (!IsAtomic) {1466    if (UseMemMove)1467      NewCall = Builder.CreateMemMove(StoreBasePtr, StoreAlign, LoadBasePtr,1468                                      LoadAlign, NumBytes,1469                                      /*isVolatile=*/false, AATags);1470    else1471      NewCall =1472          Builder.CreateMemCpy(StoreBasePtr, StoreAlign, LoadBasePtr, LoadAlign,1473                               NumBytes, /*isVolatile=*/false, AATags);1474  } else {1475    // Create the call.1476    // Note that unordered atomic loads/stores are *required* by the spec to1477    // have an alignment but non-atomic loads/stores may not.1478    NewCall = Builder.CreateElementUnorderedAtomicMemCpy(1479        StoreBasePtr, *StoreAlign, LoadBasePtr, *LoadAlign, NumBytes, StoreSize,1480        AATags);1481  }1482  NewCall->setDebugLoc(TheStore->getDebugLoc());1483 1484  if (MSSAU) {1485    MemoryAccess *NewMemAcc = MSSAU->createMemoryAccessInBB(1486        NewCall, nullptr, NewCall->getParent(), MemorySSA::BeforeTerminator);1487    MSSAU->insertDef(cast<MemoryDef>(NewMemAcc), true);1488  }1489 1490  LLVM_DEBUG(dbgs() << "  Formed new call: " << *NewCall << "\n"1491                    << "    from load ptr=" << *LoadEv << " at: " << *TheLoad1492                    << "\n"1493                    << "    from store ptr=" << *StoreEv << " at: " << *TheStore1494                    << "\n");1495 1496  ORE.emit([&]() {1497    return OptimizationRemark(DEBUG_TYPE, "ProcessLoopStoreOfLoopLoad",1498                              NewCall->getDebugLoc(), Preheader)1499           << "Formed a call to "1500           << ore::NV("NewFunction", NewCall->getCalledFunction())1501           << "() intrinsic from " << ore::NV("Inst", InstRemark)1502           << " instruction in " << ore::NV("Function", TheStore->getFunction())1503           << " function"1504           << ore::setExtraArgs()1505           << ore::NV("FromBlock", TheStore->getParent()->getName())1506           << ore::NV("ToBlock", Preheader->getName());1507  });1508 1509  // Okay, a new call to memcpy/memmove has been formed.  Zap the original store1510  // and anything that feeds into it.1511  if (MSSAU)1512    MSSAU->removeMemoryAccess(TheStore, true);1513  deleteDeadInstruction(TheStore);1514  if (MSSAU && VerifyMemorySSA)1515    MSSAU->getMemorySSA()->verifyMemorySSA();1516  if (UseMemMove)1517    ++NumMemMove;1518  else1519    ++NumMemCpy;1520  ExpCleaner.markResultUsed();1521  return true;1522}1523 1524// When compiling for codesize we avoid idiom recognition for a multi-block loop1525// unless it is a loop_memset idiom or a memset/memcpy idiom in a nested loop.1526//1527bool LoopIdiomRecognize::avoidLIRForMultiBlockLoop(bool IsMemset,1528                                                   bool IsLoopMemset) {1529  if (ApplyCodeSizeHeuristics && CurLoop->getNumBlocks() > 1) {1530    if (CurLoop->isOutermost() && (!IsMemset || !IsLoopMemset)) {1531      LLVM_DEBUG(dbgs() << "  " << CurLoop->getHeader()->getParent()->getName()1532                        << " : LIR " << (IsMemset ? "Memset" : "Memcpy")1533                        << " avoided: multi-block top-level loop\n");1534      return true;1535    }1536  }1537 1538  return false;1539}1540 1541bool LoopIdiomRecognize::optimizeCRCLoop(const PolynomialInfo &Info) {1542  // FIXME: Hexagon has a special HexagonLoopIdiom that optimizes CRC using1543  // carry-less multiplication instructions, which is more efficient than our1544  // Sarwate table-lookup optimization. Hence, until we're able to emit1545  // target-specific instructions for Hexagon, subsuming HexagonLoopIdiom,1546  // disable the optimization for Hexagon.1547  Module &M = *CurLoop->getHeader()->getModule();1548  Triple TT(M.getTargetTriple());1549  if (TT.getArch() == Triple::hexagon)1550    return false;1551 1552  // First, create a new GlobalVariable corresponding to the1553  // Sarwate-lookup-table.1554  Type *CRCTy = Info.LHS->getType();1555  unsigned CRCBW = CRCTy->getIntegerBitWidth();1556  std::array<Constant *, 256> CRCConstants;1557  transform(HashRecognize::genSarwateTable(Info.RHS, Info.ByteOrderSwapped),1558            CRCConstants.begin(),1559            [CRCTy](const APInt &E) { return ConstantInt::get(CRCTy, E); });1560  Constant *ConstArray =1561      ConstantArray::get(ArrayType::get(CRCTy, 256), CRCConstants);1562  GlobalVariable *GV =1563      new GlobalVariable(M, ConstArray->getType(), true,1564                         GlobalValue::PrivateLinkage, ConstArray, ".crctable");1565 1566  PHINode *IV = CurLoop->getCanonicalInductionVariable();1567  SmallVector<PHINode *, 2> Cleanup;1568 1569  // Next, mark all PHIs for removal except IV.1570  {1571    for (PHINode &PN : CurLoop->getHeader()->phis()) {1572      if (&PN == IV)1573        continue;1574      PN.replaceAllUsesWith(PoisonValue::get(PN.getType()));1575      Cleanup.push_back(&PN);1576    }1577  }1578 1579  // Next, fix up the trip count.1580  {1581    unsigned NewBTC = (Info.TripCount / 8) - 1;1582    BasicBlock *LoopBlk = CurLoop->getLoopLatch();1583    BranchInst *BrInst = cast<BranchInst>(LoopBlk->getTerminator());1584    CmpPredicate ExitPred = BrInst->getSuccessor(0) == LoopBlk1585                                ? ICmpInst::Predicate::ICMP_NE1586                                : ICmpInst::Predicate::ICMP_EQ;1587    Instruction *ExitCond = CurLoop->getLatchCmpInst();1588    Value *ExitLimit = ConstantInt::get(IV->getType(), NewBTC);1589    IRBuilder<> Builder(ExitCond);1590    Value *NewExitCond =1591        Builder.CreateICmp(ExitPred, IV, ExitLimit, "exit.cond");1592    ExitCond->replaceAllUsesWith(NewExitCond);1593    deleteDeadInstruction(ExitCond);1594  }1595 1596  // Finally, fill the loop with the Sarwate-table-lookup logic, and replace all1597  // uses of ComputedValue.1598  //1599  // Little-endian:1600  //   crc = (crc >> 8) ^ tbl[(iv'th byte of data) ^ (bottom byte of crc)]1601  // Big-Endian:1602  //   crc = (crc << 8) ^ tbl[(iv'th byte of data) ^ (top byte of crc)]1603  {1604    auto LoByte = [](IRBuilderBase &Builder, Value *Op, const Twine &Name) {1605      return Builder.CreateZExtOrTrunc(1606          Op, IntegerType::getInt8Ty(Op->getContext()), Name);1607    };1608    auto HiIdx = [LoByte, CRCBW](IRBuilderBase &Builder, Value *Op,1609                                 const Twine &Name) {1610      Type *OpTy = Op->getType();1611 1612      // When the bitwidth of the CRC mismatches the Op's bitwidth, we need to1613      // use the CRC's bitwidth as the reference for shifting right.1614      return LoByte(Builder,1615                    CRCBW > 8 ? Builder.CreateLShr(1616                                    Op, ConstantInt::get(OpTy, CRCBW - 8), Name)1617                              : Op,1618                    Name + ".lo.byte");1619    };1620 1621    IRBuilder<> Builder(CurLoop->getHeader(),1622                        CurLoop->getHeader()->getFirstNonPHIIt());1623 1624    // Create the CRC PHI, and initialize its incoming value to the initial1625    // value of CRC.1626    PHINode *CRCPhi = Builder.CreatePHI(CRCTy, 2, "crc");1627    CRCPhi->addIncoming(Info.LHS, CurLoop->getLoopPreheader());1628 1629    // CRC is now an evolving variable, initialized to the PHI.1630    Value *CRC = CRCPhi;1631 1632    // TableIndexer = ((top|bottom) byte of CRC). It is XOR'ed with (iv'th byte1633    // of LHSAux), if LHSAux is non-nullptr.1634    Value *Indexer = CRC;1635    if (Value *Data = Info.LHSAux) {1636      Type *DataTy = Data->getType();1637 1638      // To index into the (iv'th byte of LHSAux), we multiply iv by 8, and we1639      // shift right by that amount, and take the lo-byte (in the little-endian1640      // case), or shift left by that amount, and take the hi-idx (in the1641      // big-endian case).1642      Value *IVBits = Builder.CreateZExtOrTrunc(1643          Builder.CreateShl(IV, 3, "iv.bits"), DataTy, "iv.indexer");1644      Value *DataIndexer =1645          Info.ByteOrderSwapped1646              ? Builder.CreateShl(Data, IVBits, "data.indexer")1647              : Builder.CreateLShr(Data, IVBits, "data.indexer");1648      Indexer = Builder.CreateXor(1649          DataIndexer,1650          Builder.CreateZExtOrTrunc(Indexer, DataTy, "crc.indexer.cast"),1651          "crc.data.indexer");1652    }1653 1654    Indexer = Info.ByteOrderSwapped ? HiIdx(Builder, Indexer, "indexer.hi")1655                                    : LoByte(Builder, Indexer, "indexer.lo");1656 1657    // Always index into a GEP using the index type.1658    Indexer = Builder.CreateZExt(1659        Indexer, SE->getDataLayout().getIndexType(GV->getType()),1660        "indexer.ext");1661 1662    // CRCTableLd = CRCTable[(iv'th byte of data) ^ (top|bottom) byte of CRC].1663    Value *CRCTableGEP =1664        Builder.CreateInBoundsGEP(CRCTy, GV, Indexer, "tbl.ptradd");1665    Value *CRCTableLd = Builder.CreateLoad(CRCTy, CRCTableGEP, "tbl.ld");1666 1667    // CRCNext = (CRC (<<|>>) 8) ^ CRCTableLd, or simply CRCTableLd in case of1668    // CRC-8.1669    Value *CRCNext = CRCTableLd;1670    if (CRCBW > 8) {1671      Value *CRCShift = Info.ByteOrderSwapped1672                            ? Builder.CreateShl(CRC, 8, "crc.be.shift")1673                            : Builder.CreateLShr(CRC, 8, "crc.le.shift");1674      CRCNext = Builder.CreateXor(CRCShift, CRCTableLd, "crc.next");1675    }1676 1677    // Connect the back-edge for the loop, and RAUW the ComputedValue.1678    CRCPhi->addIncoming(CRCNext, CurLoop->getLoopLatch());1679    Info.ComputedValue->replaceUsesOutsideBlock(CRCNext,1680                                                CurLoop->getLoopLatch());1681  }1682 1683  // Cleanup.1684  {1685    for (PHINode *PN : Cleanup)1686      RecursivelyDeleteDeadPHINode(PN);1687    SE->forgetLoop(CurLoop);1688  }1689  return true;1690}1691 1692bool LoopIdiomRecognize::runOnNoncountableLoop() {1693  LLVM_DEBUG(dbgs() << DEBUG_TYPE " Scanning: F["1694                    << CurLoop->getHeader()->getParent()->getName()1695                    << "] Noncountable Loop %"1696                    << CurLoop->getHeader()->getName() << "\n");1697 1698  return recognizePopcount() || recognizeAndInsertFFS() ||1699         recognizeShiftUntilBitTest() || recognizeShiftUntilZero() ||1700         recognizeShiftUntilLessThan() || recognizeAndInsertStrLen();1701}1702 1703/// Check if the given conditional branch is based on the comparison between1704/// a variable and zero, and if the variable is non-zero or zero (JmpOnZero is1705/// true), the control yields to the loop entry. If the branch matches the1706/// behavior, the variable involved in the comparison is returned. This function1707/// will be called to see if the precondition and postcondition of the loop are1708/// in desirable form.1709static Value *matchCondition(BranchInst *BI, BasicBlock *LoopEntry,1710                             bool JmpOnZero = false) {1711  if (!BI || !BI->isConditional())1712    return nullptr;1713 1714  ICmpInst *Cond = dyn_cast<ICmpInst>(BI->getCondition());1715  if (!Cond)1716    return nullptr;1717 1718  auto *CmpZero = dyn_cast<ConstantInt>(Cond->getOperand(1));1719  if (!CmpZero || !CmpZero->isZero())1720    return nullptr;1721 1722  BasicBlock *TrueSucc = BI->getSuccessor(0);1723  BasicBlock *FalseSucc = BI->getSuccessor(1);1724  if (JmpOnZero)1725    std::swap(TrueSucc, FalseSucc);1726 1727  ICmpInst::Predicate Pred = Cond->getPredicate();1728  if ((Pred == ICmpInst::ICMP_NE && TrueSucc == LoopEntry) ||1729      (Pred == ICmpInst::ICMP_EQ && FalseSucc == LoopEntry))1730    return Cond->getOperand(0);1731 1732  return nullptr;1733}1734 1735namespace {1736 1737class StrlenVerifier {1738public:1739  explicit StrlenVerifier(const Loop *CurLoop, ScalarEvolution *SE,1740                          const TargetLibraryInfo *TLI)1741      : CurLoop(CurLoop), SE(SE), TLI(TLI) {}1742 1743  bool isValidStrlenIdiom() {1744    // Give up if the loop has multiple blocks, multiple backedges, or1745    // multiple exit blocks1746    if (CurLoop->getNumBackEdges() != 1 || CurLoop->getNumBlocks() != 1 ||1747        !CurLoop->getUniqueExitBlock())1748      return false;1749 1750    // It should have a preheader and a branch instruction.1751    BasicBlock *Preheader = CurLoop->getLoopPreheader();1752    if (!Preheader)1753      return false;1754 1755    BranchInst *EntryBI = dyn_cast<BranchInst>(Preheader->getTerminator());1756    if (!EntryBI)1757      return false;1758 1759    // The loop exit must be conditioned on an icmp with 0 the null terminator.1760    // The icmp operand has to be a load on some SSA reg that increments1761    // by 1 in the loop.1762    BasicBlock *LoopBody = *CurLoop->block_begin();1763 1764    // Skip if the body is too big as it most likely is not a strlen idiom.1765    if (!LoopBody || LoopBody->size() >= 15)1766      return false;1767 1768    BranchInst *LoopTerm = dyn_cast<BranchInst>(LoopBody->getTerminator());1769    Value *LoopCond = matchCondition(LoopTerm, LoopBody);1770    if (!LoopCond)1771      return false;1772 1773    LoadInst *LoopLoad = dyn_cast<LoadInst>(LoopCond);1774    if (!LoopLoad || LoopLoad->getPointerAddressSpace() != 0)1775      return false;1776 1777    OperandType = LoopLoad->getType();1778    if (!OperandType || !OperandType->isIntegerTy())1779      return false;1780 1781    // See if the pointer expression is an AddRec with constant step a of form1782    // ({n,+,a}) where a is the width of the char type.1783    Value *IncPtr = LoopLoad->getPointerOperand();1784    const SCEV *LoadEv = SE->getSCEV(IncPtr);1785    const APInt *Step;1786    if (!match(LoadEv,1787               m_scev_AffineAddRec(m_SCEV(LoadBaseEv), m_scev_APInt(Step))))1788      return false;1789 1790    LLVM_DEBUG(dbgs() << "pointer load scev: " << *LoadEv << "\n");1791 1792    unsigned StepSize = Step->getZExtValue();1793 1794    // Verify that StepSize is consistent with platform char width.1795    OpWidth = OperandType->getIntegerBitWidth();1796    unsigned WcharSize = TLI->getWCharSize(*LoopLoad->getModule());1797    if (OpWidth != StepSize * 8)1798      return false;1799    if (OpWidth != 8 && OpWidth != 16 && OpWidth != 32)1800      return false;1801    if (OpWidth >= 16)1802      if (OpWidth != WcharSize * 8)1803        return false;1804 1805    // Scan every instruction in the loop to ensure there are no side effects.1806    for (Instruction &I : *LoopBody)1807      if (I.mayHaveSideEffects())1808        return false;1809 1810    BasicBlock *LoopExitBB = CurLoop->getExitBlock();1811    if (!LoopExitBB)1812      return false;1813 1814    for (PHINode &PN : LoopExitBB->phis()) {1815      if (!SE->isSCEVable(PN.getType()))1816        return false;1817 1818      const SCEV *Ev = SE->getSCEV(&PN);1819      if (!Ev)1820        return false;1821 1822      LLVM_DEBUG(dbgs() << "loop exit phi scev: " << *Ev << "\n");1823 1824      // Since we verified that the loop trip count will be a valid strlen1825      // idiom, we can expand all lcssa phi with {n,+,1} as (n + strlen) and use1826      // SCEVExpander materialize the loop output.1827      const SCEVAddRecExpr *AddRecEv = dyn_cast<SCEVAddRecExpr>(Ev);1828      if (!AddRecEv || !AddRecEv->isAffine())1829        return false;1830 1831      // We only want RecAddExpr with recurrence step that is constant. This1832      // is good enough for all the idioms we want to recognize. Later we expand1833      // and materialize the recurrence as {base,+,a} -> (base + a * strlen)1834      if (!isa<SCEVConstant>(AddRecEv->getStepRecurrence(*SE)))1835        return false;1836    }1837 1838    return true;1839  }1840 1841public:1842  const Loop *CurLoop;1843  ScalarEvolution *SE;1844  const TargetLibraryInfo *TLI;1845 1846  unsigned OpWidth;1847  ConstantInt *StepSizeCI;1848  const SCEV *LoadBaseEv;1849  Type *OperandType;1850};1851 1852} // namespace1853 1854/// The Strlen Idiom we are trying to detect has the following structure1855///1856/// preheader:1857///   ...1858///   br label %body, ...1859///1860/// body:1861///   ... ; %0 is incremented by a gep1862///   %1 = load i8, ptr %0, align 11863///   %2 = icmp eq i8 %1, 01864///   br i1 %2, label %exit, label %body1865///1866/// exit:1867///   %lcssa = phi [%0, %body], ...1868///1869/// We expect the strlen idiom to have a load of a character type that1870/// is compared against '\0', and such load pointer operand must have scev1871/// expression of the form {%str,+,c} where c is a ConstantInt of the1872/// appropiate character width for the idiom, and %str is the base of the string1873/// And, that all lcssa phis have the form {...,+,n} where n is a constant,1874///1875/// When transforming the output of the strlen idiom, the lccsa phi are1876/// expanded using SCEVExpander as {base scev,+,a} -> (base scev + a * strlen)1877/// and all subsequent uses are replaced. For example,1878///1879/// \code{.c}1880///     const char* base = str;1881///     while (*str != '\0')1882///         ++str;1883///     size_t result = str - base;1884/// \endcode1885///1886/// will be transformed as follows: The idiom will be replaced by a strlen1887/// computation to compute the address of the null terminator of the string.1888///1889/// \code{.c}1890///     const char* base = str;1891///     const char* end = base + strlen(str);1892///     size_t result = end - base;1893/// \endcode1894///1895/// In the case we index by an induction variable, as long as the induction1896/// variable has a constant int increment, we can replace all such indvars1897/// with the closed form computation of strlen1898///1899/// \code{.c}1900///     size_t i = 0;1901///     while (str[i] != '\0')1902///         ++i;1903///     size_t result = i;1904/// \endcode1905///1906/// Will be replaced by1907///1908/// \code{.c}1909///     size_t i = 0 + strlen(str);1910///     size_t result = i;1911/// \endcode1912///1913bool LoopIdiomRecognize::recognizeAndInsertStrLen() {1914  if (DisableLIRP::All)1915    return false;1916 1917  StrlenVerifier Verifier(CurLoop, SE, TLI);1918 1919  if (!Verifier.isValidStrlenIdiom())1920    return false;1921 1922  BasicBlock *Preheader = CurLoop->getLoopPreheader();1923  BasicBlock *LoopBody = *CurLoop->block_begin();1924  BasicBlock *LoopExitBB = CurLoop->getExitBlock();1925  BranchInst *LoopTerm = dyn_cast<BranchInst>(LoopBody->getTerminator());1926  assert(Preheader && LoopBody && LoopExitBB && LoopTerm &&1927         "Should be verified to be valid by StrlenVerifier");1928 1929  if (Verifier.OpWidth == 8) {1930    if (DisableLIRP::Strlen)1931      return false;1932    if (!isLibFuncEmittable(Preheader->getModule(), TLI, LibFunc_strlen))1933      return false;1934  } else {1935    if (DisableLIRP::Wcslen)1936      return false;1937    if (!isLibFuncEmittable(Preheader->getModule(), TLI, LibFunc_wcslen))1938      return false;1939  }1940 1941  IRBuilder<> Builder(Preheader->getTerminator());1942  Builder.SetCurrentDebugLocation(CurLoop->getStartLoc());1943  SCEVExpander Expander(*SE, Preheader->getModule()->getDataLayout(),1944                        "strlen_idiom");1945  Value *MaterialzedBase = Expander.expandCodeFor(1946      Verifier.LoadBaseEv, Verifier.LoadBaseEv->getType(),1947      Builder.GetInsertPoint());1948 1949  Value *StrLenFunc = nullptr;1950  if (Verifier.OpWidth == 8) {1951    StrLenFunc = emitStrLen(MaterialzedBase, Builder, *DL, TLI);1952  } else {1953    StrLenFunc = emitWcsLen(MaterialzedBase, Builder, *DL, TLI);1954  }1955  assert(StrLenFunc && "Failed to emit strlen function.");1956 1957  const SCEV *StrlenEv = SE->getSCEV(StrLenFunc);1958  SmallVector<PHINode *, 4> Cleanup;1959  for (PHINode &PN : LoopExitBB->phis()) {1960    // We can now materialize the loop output as all phi have scev {base,+,a}.1961    // We expand the phi as:1962    //   %strlen = call i64 @strlen(%str)1963    //   %phi.new = base expression + step * %strlen1964    const SCEV *Ev = SE->getSCEV(&PN);1965    const SCEVAddRecExpr *AddRecEv = dyn_cast<SCEVAddRecExpr>(Ev);1966    const SCEVConstant *Step =1967        dyn_cast<SCEVConstant>(AddRecEv->getStepRecurrence(*SE));1968    const SCEV *Base = AddRecEv->getStart();1969 1970    // It is safe to truncate to base since if base is narrower than size_t1971    // the equivalent user code will have to truncate anyways.1972    const SCEV *NewEv = SE->getAddExpr(1973        Base, SE->getMulExpr(Step, SE->getTruncateOrSignExtend(1974                                       StrlenEv, Base->getType())));1975 1976    Value *MaterializedPHI = Expander.expandCodeFor(NewEv, NewEv->getType(),1977                                                    Builder.GetInsertPoint());1978    Expander.clear();1979    PN.replaceAllUsesWith(MaterializedPHI);1980    Cleanup.push_back(&PN);1981  }1982 1983  // All LCSSA Loop Phi are dead, the left over dead loop body can be cleaned1984  // up by later passes1985  for (PHINode *PN : Cleanup)1986    RecursivelyDeleteDeadPHINode(PN);1987 1988  // LoopDeletion only delete invariant loops with known trip-count. We can1989  // update the condition so it will reliablely delete the invariant loop1990  assert(LoopTerm->getNumSuccessors() == 2 &&1991         (LoopTerm->getSuccessor(0) == LoopBody ||1992          LoopTerm->getSuccessor(1) == LoopBody) &&1993         "loop body must have a successor that is it self");1994  ConstantInt *NewLoopCond = LoopTerm->getSuccessor(0) == LoopBody1995                                 ? Builder.getFalse()1996                                 : Builder.getTrue();1997  LoopTerm->setCondition(NewLoopCond);1998  SE->forgetLoop(CurLoop);1999 2000  ++NumStrLen;2001  LLVM_DEBUG(dbgs() << "  Formed strlen idiom: " << *StrLenFunc << "\n");2002  ORE.emit([&]() {2003    return OptimizationRemark(DEBUG_TYPE, "recognizeAndInsertStrLen",2004                              CurLoop->getStartLoc(), Preheader)2005           << "Transformed " << StrLenFunc->getName() << " loop idiom";2006  });2007 2008  return true;2009}2010 2011/// Check if the given conditional branch is based on an unsigned less-than2012/// comparison between a variable and a constant, and if the comparison is false2013/// the control yields to the loop entry. If the branch matches the behaviour,2014/// the variable involved in the comparison is returned.2015static Value *matchShiftULTCondition(BranchInst *BI, BasicBlock *LoopEntry,2016                                     APInt &Threshold) {2017  if (!BI || !BI->isConditional())2018    return nullptr;2019 2020  ICmpInst *Cond = dyn_cast<ICmpInst>(BI->getCondition());2021  if (!Cond)2022    return nullptr;2023 2024  ConstantInt *CmpConst = dyn_cast<ConstantInt>(Cond->getOperand(1));2025  if (!CmpConst)2026    return nullptr;2027 2028  BasicBlock *FalseSucc = BI->getSuccessor(1);2029  ICmpInst::Predicate Pred = Cond->getPredicate();2030 2031  if (Pred == ICmpInst::ICMP_ULT && FalseSucc == LoopEntry) {2032    Threshold = CmpConst->getValue();2033    return Cond->getOperand(0);2034  }2035 2036  return nullptr;2037}2038 2039// Check if the recurrence variable `VarX` is in the right form to create2040// the idiom. Returns the value coerced to a PHINode if so.2041static PHINode *getRecurrenceVar(Value *VarX, Instruction *DefX,2042                                 BasicBlock *LoopEntry) {2043  auto *PhiX = dyn_cast<PHINode>(VarX);2044  if (PhiX && PhiX->getParent() == LoopEntry &&2045      (PhiX->getOperand(0) == DefX || PhiX->getOperand(1) == DefX))2046    return PhiX;2047  return nullptr;2048}2049 2050/// Return true if the idiom is detected in the loop.2051///2052/// Additionally:2053/// 1) \p CntInst is set to the instruction Counting Leading Zeros (CTLZ)2054///       or nullptr if there is no such.2055/// 2) \p CntPhi is set to the corresponding phi node2056///       or nullptr if there is no such.2057/// 3) \p InitX is set to the value whose CTLZ could be used.2058/// 4) \p DefX is set to the instruction calculating Loop exit condition.2059/// 5) \p Threshold is set to the constant involved in the unsigned less-than2060///       comparison.2061///2062/// The core idiom we are trying to detect is:2063/// \code2064///    if (x0 < 2)2065///      goto loop-exit // the precondition of the loop2066///    cnt0 = init-val2067///    do {2068///      x = phi (x0, x.next);   //PhiX2069///      cnt = phi (cnt0, cnt.next)2070///2071///      cnt.next = cnt + 1;2072///       ...2073///      x.next = x >> 1;   // DefX2074///    } while (x >= 4)2075/// loop-exit:2076/// \endcode2077static bool detectShiftUntilLessThanIdiom(Loop *CurLoop, const DataLayout &DL,2078                                          Intrinsic::ID &IntrinID,2079                                          Value *&InitX, Instruction *&CntInst,2080                                          PHINode *&CntPhi, Instruction *&DefX,2081                                          APInt &Threshold) {2082  BasicBlock *LoopEntry;2083 2084  DefX = nullptr;2085  CntInst = nullptr;2086  CntPhi = nullptr;2087  LoopEntry = *(CurLoop->block_begin());2088 2089  // step 1: Check if the loop-back branch is in desirable form.2090  if (Value *T = matchShiftULTCondition(2091          dyn_cast<BranchInst>(LoopEntry->getTerminator()), LoopEntry,2092          Threshold))2093    DefX = dyn_cast<Instruction>(T);2094  else2095    return false;2096 2097  // step 2: Check the recurrence of variable X2098  if (!DefX || !isa<PHINode>(DefX))2099    return false;2100 2101  PHINode *VarPhi = cast<PHINode>(DefX);2102  int Idx = VarPhi->getBasicBlockIndex(LoopEntry);2103  if (Idx == -1)2104    return false;2105 2106  DefX = dyn_cast<Instruction>(VarPhi->getIncomingValue(Idx));2107  if (!DefX || DefX->getNumOperands() == 0 || DefX->getOperand(0) != VarPhi)2108    return false;2109 2110  // step 3: detect instructions corresponding to "x.next = x >> 1"2111  if (DefX->getOpcode() != Instruction::LShr)2112    return false;2113 2114  IntrinID = Intrinsic::ctlz;2115  ConstantInt *Shft = dyn_cast<ConstantInt>(DefX->getOperand(1));2116  if (!Shft || !Shft->isOne())2117    return false;2118 2119  InitX = VarPhi->getIncomingValueForBlock(CurLoop->getLoopPreheader());2120 2121  // step 4: Find the instruction which count the CTLZ: cnt.next = cnt + 12122  //         or cnt.next = cnt + -1.2123  // TODO: We can skip the step. If loop trip count is known (CTLZ),2124  //       then all uses of "cnt.next" could be optimized to the trip count2125  //       plus "cnt0". Currently it is not optimized.2126  //       This step could be used to detect POPCNT instruction:2127  //       cnt.next = cnt + (x.next & 1)2128  for (Instruction &Inst :2129       llvm::make_range(LoopEntry->getFirstNonPHIIt(), LoopEntry->end())) {2130    if (Inst.getOpcode() != Instruction::Add)2131      continue;2132 2133    ConstantInt *Inc = dyn_cast<ConstantInt>(Inst.getOperand(1));2134    if (!Inc || (!Inc->isOne() && !Inc->isMinusOne()))2135      continue;2136 2137    PHINode *Phi = getRecurrenceVar(Inst.getOperand(0), &Inst, LoopEntry);2138    if (!Phi)2139      continue;2140 2141    CntInst = &Inst;2142    CntPhi = Phi;2143    break;2144  }2145  if (!CntInst)2146    return false;2147 2148  return true;2149}2150 2151/// Return true iff the idiom is detected in the loop.2152///2153/// Additionally:2154/// 1) \p CntInst is set to the instruction counting the population bit.2155/// 2) \p CntPhi is set to the corresponding phi node.2156/// 3) \p Var is set to the value whose population bits are being counted.2157///2158/// The core idiom we are trying to detect is:2159/// \code2160///    if (x0 != 0)2161///      goto loop-exit // the precondition of the loop2162///    cnt0 = init-val;2163///    do {2164///       x1 = phi (x0, x2);2165///       cnt1 = phi(cnt0, cnt2);2166///2167///       cnt2 = cnt1 + 1;2168///        ...2169///       x2 = x1 & (x1 - 1);2170///        ...2171///    } while(x != 0);2172///2173/// loop-exit:2174/// \endcode2175static bool detectPopcountIdiom(Loop *CurLoop, BasicBlock *PreCondBB,2176                                Instruction *&CntInst, PHINode *&CntPhi,2177                                Value *&Var) {2178  // step 1: Check to see if the look-back branch match this pattern:2179  //    "if (a!=0) goto loop-entry".2180  BasicBlock *LoopEntry;2181  Instruction *DefX2, *CountInst;2182  Value *VarX1, *VarX0;2183  PHINode *PhiX, *CountPhi;2184 2185  DefX2 = CountInst = nullptr;2186  VarX1 = VarX0 = nullptr;2187  PhiX = CountPhi = nullptr;2188  LoopEntry = *(CurLoop->block_begin());2189 2190  // step 1: Check if the loop-back branch is in desirable form.2191  {2192    if (Value *T = matchCondition(2193            dyn_cast<BranchInst>(LoopEntry->getTerminator()), LoopEntry))2194      DefX2 = dyn_cast<Instruction>(T);2195    else2196      return false;2197  }2198 2199  // step 2: detect instructions corresponding to "x2 = x1 & (x1 - 1)"2200  {2201    if (!DefX2 || DefX2->getOpcode() != Instruction::And)2202      return false;2203 2204    BinaryOperator *SubOneOp;2205 2206    if ((SubOneOp = dyn_cast<BinaryOperator>(DefX2->getOperand(0))))2207      VarX1 = DefX2->getOperand(1);2208    else {2209      VarX1 = DefX2->getOperand(0);2210      SubOneOp = dyn_cast<BinaryOperator>(DefX2->getOperand(1));2211    }2212    if (!SubOneOp || SubOneOp->getOperand(0) != VarX1)2213      return false;2214 2215    ConstantInt *Dec = dyn_cast<ConstantInt>(SubOneOp->getOperand(1));2216    if (!Dec ||2217        !((SubOneOp->getOpcode() == Instruction::Sub && Dec->isOne()) ||2218          (SubOneOp->getOpcode() == Instruction::Add &&2219           Dec->isMinusOne()))) {2220      return false;2221    }2222  }2223 2224  // step 3: Check the recurrence of variable X2225  PhiX = getRecurrenceVar(VarX1, DefX2, LoopEntry);2226  if (!PhiX)2227    return false;2228 2229  // step 4: Find the instruction which count the population: cnt2 = cnt1 + 12230  {2231    CountInst = nullptr;2232    for (Instruction &Inst :2233         llvm::make_range(LoopEntry->getFirstNonPHIIt(), LoopEntry->end())) {2234      if (Inst.getOpcode() != Instruction::Add)2235        continue;2236 2237      ConstantInt *Inc = dyn_cast<ConstantInt>(Inst.getOperand(1));2238      if (!Inc || !Inc->isOne())2239        continue;2240 2241      PHINode *Phi = getRecurrenceVar(Inst.getOperand(0), &Inst, LoopEntry);2242      if (!Phi)2243        continue;2244 2245      // Check if the result of the instruction is live of the loop.2246      bool LiveOutLoop = false;2247      for (User *U : Inst.users()) {2248        if ((cast<Instruction>(U))->getParent() != LoopEntry) {2249          LiveOutLoop = true;2250          break;2251        }2252      }2253 2254      if (LiveOutLoop) {2255        CountInst = &Inst;2256        CountPhi = Phi;2257        break;2258      }2259    }2260 2261    if (!CountInst)2262      return false;2263  }2264 2265  // step 5: check if the precondition is in this form:2266  //   "if (x != 0) goto loop-head ; else goto somewhere-we-don't-care;"2267  {2268    auto *PreCondBr = dyn_cast<BranchInst>(PreCondBB->getTerminator());2269    Value *T = matchCondition(PreCondBr, CurLoop->getLoopPreheader());2270    if (T != PhiX->getOperand(0) && T != PhiX->getOperand(1))2271      return false;2272 2273    CntInst = CountInst;2274    CntPhi = CountPhi;2275    Var = T;2276  }2277 2278  return true;2279}2280 2281/// Return true if the idiom is detected in the loop.2282///2283/// Additionally:2284/// 1) \p CntInst is set to the instruction Counting Leading Zeros (CTLZ)2285///       or nullptr if there is no such.2286/// 2) \p CntPhi is set to the corresponding phi node2287///       or nullptr if there is no such.2288/// 3) \p Var is set to the value whose CTLZ could be used.2289/// 4) \p DefX is set to the instruction calculating Loop exit condition.2290///2291/// The core idiom we are trying to detect is:2292/// \code2293///    if (x0 == 0)2294///      goto loop-exit // the precondition of the loop2295///    cnt0 = init-val;2296///    do {2297///       x = phi (x0, x.next);   //PhiX2298///       cnt = phi(cnt0, cnt.next);2299///2300///       cnt.next = cnt + 1;2301///        ...2302///       x.next = x >> 1;   // DefX2303///        ...2304///    } while(x.next != 0);2305///2306/// loop-exit:2307/// \endcode2308static bool detectShiftUntilZeroIdiom(Loop *CurLoop, const DataLayout &DL,2309                                      Intrinsic::ID &IntrinID, Value *&InitX,2310                                      Instruction *&CntInst, PHINode *&CntPhi,2311                                      Instruction *&DefX) {2312  BasicBlock *LoopEntry;2313  Value *VarX = nullptr;2314 2315  DefX = nullptr;2316  CntInst = nullptr;2317  CntPhi = nullptr;2318  LoopEntry = *(CurLoop->block_begin());2319 2320  // step 1: Check if the loop-back branch is in desirable form.2321  if (Value *T = matchCondition(2322          dyn_cast<BranchInst>(LoopEntry->getTerminator()), LoopEntry))2323    DefX = dyn_cast<Instruction>(T);2324  else2325    return false;2326 2327  // step 2: detect instructions corresponding to "x.next = x >> 1 or x << 1"2328  if (!DefX || !DefX->isShift())2329    return false;2330  IntrinID = DefX->getOpcode() == Instruction::Shl ? Intrinsic::cttz :2331                                                     Intrinsic::ctlz;2332  ConstantInt *Shft = dyn_cast<ConstantInt>(DefX->getOperand(1));2333  if (!Shft || !Shft->isOne())2334    return false;2335  VarX = DefX->getOperand(0);2336 2337  // step 3: Check the recurrence of variable X2338  PHINode *PhiX = getRecurrenceVar(VarX, DefX, LoopEntry);2339  if (!PhiX)2340    return false;2341 2342  InitX = PhiX->getIncomingValueForBlock(CurLoop->getLoopPreheader());2343 2344  // Make sure the initial value can't be negative otherwise the ashr in the2345  // loop might never reach zero which would make the loop infinite.2346  if (DefX->getOpcode() == Instruction::AShr && !isKnownNonNegative(InitX, DL))2347    return false;2348 2349  // step 4: Find the instruction which count the CTLZ: cnt.next = cnt + 12350  //         or cnt.next = cnt + -1.2351  // TODO: We can skip the step. If loop trip count is known (CTLZ),2352  //       then all uses of "cnt.next" could be optimized to the trip count2353  //       plus "cnt0". Currently it is not optimized.2354  //       This step could be used to detect POPCNT instruction:2355  //       cnt.next = cnt + (x.next & 1)2356  for (Instruction &Inst :2357       llvm::make_range(LoopEntry->getFirstNonPHIIt(), LoopEntry->end())) {2358    if (Inst.getOpcode() != Instruction::Add)2359      continue;2360 2361    ConstantInt *Inc = dyn_cast<ConstantInt>(Inst.getOperand(1));2362    if (!Inc || (!Inc->isOne() && !Inc->isMinusOne()))2363      continue;2364 2365    PHINode *Phi = getRecurrenceVar(Inst.getOperand(0), &Inst, LoopEntry);2366    if (!Phi)2367      continue;2368 2369    CntInst = &Inst;2370    CntPhi = Phi;2371    break;2372  }2373  if (!CntInst)2374    return false;2375 2376  return true;2377}2378 2379// Check if CTLZ / CTTZ intrinsic is profitable. Assume it is always2380// profitable if we delete the loop.2381bool LoopIdiomRecognize::isProfitableToInsertFFS(Intrinsic::ID IntrinID,2382                                                 Value *InitX, bool ZeroCheck,2383                                                 size_t CanonicalSize) {2384  const Value *Args[] = {InitX,2385                         ConstantInt::getBool(InitX->getContext(), ZeroCheck)};2386 2387  // @llvm.dbg doesn't count as they have no semantic effect.2388  auto InstWithoutDebugIt = CurLoop->getHeader()->instructionsWithoutDebug();2389  uint32_t HeaderSize =2390      std::distance(InstWithoutDebugIt.begin(), InstWithoutDebugIt.end());2391 2392  IntrinsicCostAttributes Attrs(IntrinID, InitX->getType(), Args);2393  InstructionCost Cost = TTI->getIntrinsicInstrCost(2394      Attrs, TargetTransformInfo::TCK_SizeAndLatency);2395  if (HeaderSize != CanonicalSize && Cost > TargetTransformInfo::TCC_Basic)2396    return false;2397 2398  return true;2399}2400 2401/// Convert CTLZ / CTTZ idiom loop into countable loop.2402/// If CTLZ / CTTZ inserted as a new trip count returns true; otherwise,2403/// returns false.2404bool LoopIdiomRecognize::insertFFSIfProfitable(Intrinsic::ID IntrinID,2405                                               Value *InitX, Instruction *DefX,2406                                               PHINode *CntPhi,2407                                               Instruction *CntInst) {2408  bool IsCntPhiUsedOutsideLoop = false;2409  for (User *U : CntPhi->users())2410    if (!CurLoop->contains(cast<Instruction>(U))) {2411      IsCntPhiUsedOutsideLoop = true;2412      break;2413    }2414  bool IsCntInstUsedOutsideLoop = false;2415  for (User *U : CntInst->users())2416    if (!CurLoop->contains(cast<Instruction>(U))) {2417      IsCntInstUsedOutsideLoop = true;2418      break;2419    }2420  // If both CntInst and CntPhi are used outside the loop the profitability2421  // is questionable.2422  if (IsCntInstUsedOutsideLoop && IsCntPhiUsedOutsideLoop)2423    return false;2424 2425  // For some CPUs result of CTLZ(X) intrinsic is undefined2426  // when X is 0. If we can not guarantee X != 0, we need to check this2427  // when expand.2428  bool ZeroCheck = false;2429  // It is safe to assume Preheader exist as it was checked in2430  // parent function RunOnLoop.2431  BasicBlock *PH = CurLoop->getLoopPreheader();2432 2433  // If we are using the count instruction outside the loop, make sure we2434  // have a zero check as a precondition. Without the check the loop would run2435  // one iteration for before any check of the input value. This means 0 and 12436  // would have identical behavior in the original loop and thus2437  if (!IsCntPhiUsedOutsideLoop) {2438    auto *PreCondBB = PH->getSinglePredecessor();2439    if (!PreCondBB)2440      return false;2441    auto *PreCondBI = dyn_cast<BranchInst>(PreCondBB->getTerminator());2442    if (!PreCondBI)2443      return false;2444    if (matchCondition(PreCondBI, PH) != InitX)2445      return false;2446    ZeroCheck = true;2447  }2448 2449  // FFS idiom loop has only 6 instructions:2450  //  %n.addr.0 = phi [ %n, %entry ], [ %shr, %while.cond ]2451  //  %i.0 = phi [ %i0, %entry ], [ %inc, %while.cond ]2452  //  %shr = ashr %n.addr.0, 12453  //  %tobool = icmp eq %shr, 02454  //  %inc = add nsw %i.0, 12455  //  br i1 %tobool2456  size_t IdiomCanonicalSize = 6;2457  if (!isProfitableToInsertFFS(IntrinID, InitX, ZeroCheck, IdiomCanonicalSize))2458    return false;2459 2460  transformLoopToCountable(IntrinID, PH, CntInst, CntPhi, InitX, DefX,2461                           DefX->getDebugLoc(), ZeroCheck,2462                           IsCntPhiUsedOutsideLoop);2463  return true;2464}2465 2466/// Recognize CTLZ or CTTZ idiom in a non-countable loop and convert the loop2467/// to countable (with CTLZ / CTTZ trip count). If CTLZ / CTTZ inserted as a new2468/// trip count returns true; otherwise, returns false.2469bool LoopIdiomRecognize::recognizeAndInsertFFS() {2470  // Give up if the loop has multiple blocks or multiple backedges.2471  if (CurLoop->getNumBackEdges() != 1 || CurLoop->getNumBlocks() != 1)2472    return false;2473 2474  Intrinsic::ID IntrinID;2475  Value *InitX;2476  Instruction *DefX = nullptr;2477  PHINode *CntPhi = nullptr;2478  Instruction *CntInst = nullptr;2479 2480  if (!detectShiftUntilZeroIdiom(CurLoop, *DL, IntrinID, InitX, CntInst, CntPhi,2481                                 DefX))2482    return false;2483 2484  return insertFFSIfProfitable(IntrinID, InitX, DefX, CntPhi, CntInst);2485}2486 2487bool LoopIdiomRecognize::recognizeShiftUntilLessThan() {2488  // Give up if the loop has multiple blocks or multiple backedges.2489  if (CurLoop->getNumBackEdges() != 1 || CurLoop->getNumBlocks() != 1)2490    return false;2491 2492  Intrinsic::ID IntrinID;2493  Value *InitX;2494  Instruction *DefX = nullptr;2495  PHINode *CntPhi = nullptr;2496  Instruction *CntInst = nullptr;2497 2498  APInt LoopThreshold;2499  if (!detectShiftUntilLessThanIdiom(CurLoop, *DL, IntrinID, InitX, CntInst,2500                                     CntPhi, DefX, LoopThreshold))2501    return false;2502 2503  if (LoopThreshold == 2) {2504    // Treat as regular FFS.2505    return insertFFSIfProfitable(IntrinID, InitX, DefX, CntPhi, CntInst);2506  }2507 2508  // Look for Floor Log2 Idiom.2509  if (LoopThreshold != 4)2510    return false;2511 2512  // Abort if CntPhi is used outside of the loop.2513  for (User *U : CntPhi->users())2514    if (!CurLoop->contains(cast<Instruction>(U)))2515      return false;2516 2517  // It is safe to assume Preheader exist as it was checked in2518  // parent function RunOnLoop.2519  BasicBlock *PH = CurLoop->getLoopPreheader();2520  auto *PreCondBB = PH->getSinglePredecessor();2521  if (!PreCondBB)2522    return false;2523  auto *PreCondBI = dyn_cast<BranchInst>(PreCondBB->getTerminator());2524  if (!PreCondBI)2525    return false;2526 2527  APInt PreLoopThreshold;2528  if (matchShiftULTCondition(PreCondBI, PH, PreLoopThreshold) != InitX ||2529      PreLoopThreshold != 2)2530    return false;2531 2532  bool ZeroCheck = true;2533 2534  // the loop has only 6 instructions:2535  //  %n.addr.0 = phi [ %n, %entry ], [ %shr, %while.cond ]2536  //  %i.0 = phi [ %i0, %entry ], [ %inc, %while.cond ]2537  //  %shr = ashr %n.addr.0, 12538  //  %tobool = icmp ult %n.addr.0, C2539  //  %inc = add nsw %i.0, 12540  //  br i1 %tobool2541  size_t IdiomCanonicalSize = 6;2542  if (!isProfitableToInsertFFS(IntrinID, InitX, ZeroCheck, IdiomCanonicalSize))2543    return false;2544 2545  // log2(x) = w − 1 − clz(x)2546  transformLoopToCountable(IntrinID, PH, CntInst, CntPhi, InitX, DefX,2547                           DefX->getDebugLoc(), ZeroCheck,2548                           /*IsCntPhiUsedOutsideLoop=*/false,2549                           /*InsertSub=*/true);2550  return true;2551}2552 2553/// Recognizes a population count idiom in a non-countable loop.2554///2555/// If detected, transforms the relevant code to issue the popcount intrinsic2556/// function call, and returns true; otherwise, returns false.2557bool LoopIdiomRecognize::recognizePopcount() {2558  if (TTI->getPopcntSupport(32) != TargetTransformInfo::PSK_FastHardware)2559    return false;2560 2561  // Counting population are usually conducted by few arithmetic instructions.2562  // Such instructions can be easily "absorbed" by vacant slots in a2563  // non-compact loop. Therefore, recognizing popcount idiom only makes sense2564  // in a compact loop.2565 2566  // Give up if the loop has multiple blocks or multiple backedges.2567  if (CurLoop->getNumBackEdges() != 1 || CurLoop->getNumBlocks() != 1)2568    return false;2569 2570  BasicBlock *LoopBody = *(CurLoop->block_begin());2571  if (LoopBody->size() >= 20) {2572    // The loop is too big, bail out.2573    return false;2574  }2575 2576  // It should have a preheader containing nothing but an unconditional branch.2577  BasicBlock *PH = CurLoop->getLoopPreheader();2578  if (!PH || &PH->front() != PH->getTerminator())2579    return false;2580  auto *EntryBI = dyn_cast<BranchInst>(PH->getTerminator());2581  if (!EntryBI || EntryBI->isConditional())2582    return false;2583 2584  // It should have a precondition block where the generated popcount intrinsic2585  // function can be inserted.2586  auto *PreCondBB = PH->getSinglePredecessor();2587  if (!PreCondBB)2588    return false;2589  auto *PreCondBI = dyn_cast<BranchInst>(PreCondBB->getTerminator());2590  if (!PreCondBI || PreCondBI->isUnconditional())2591    return false;2592 2593  Instruction *CntInst;2594  PHINode *CntPhi;2595  Value *Val;2596  if (!detectPopcountIdiom(CurLoop, PreCondBB, CntInst, CntPhi, Val))2597    return false;2598 2599  transformLoopToPopcount(PreCondBB, CntInst, CntPhi, Val);2600  return true;2601}2602 2603static CallInst *createPopcntIntrinsic(IRBuilder<> &IRBuilder, Value *Val,2604                                       const DebugLoc &DL) {2605  Value *Ops[] = {Val};2606  Type *Tys[] = {Val->getType()};2607 2608  CallInst *CI = IRBuilder.CreateIntrinsic(Intrinsic::ctpop, Tys, Ops);2609  CI->setDebugLoc(DL);2610 2611  return CI;2612}2613 2614static CallInst *createFFSIntrinsic(IRBuilder<> &IRBuilder, Value *Val,2615                                    const DebugLoc &DL, bool ZeroCheck,2616                                    Intrinsic::ID IID) {2617  Value *Ops[] = {Val, IRBuilder.getInt1(ZeroCheck)};2618  Type *Tys[] = {Val->getType()};2619 2620  CallInst *CI = IRBuilder.CreateIntrinsic(IID, Tys, Ops);2621  CI->setDebugLoc(DL);2622 2623  return CI;2624}2625 2626/// Transform the following loop (Using CTLZ, CTTZ is similar):2627/// loop:2628///   CntPhi = PHI [Cnt0, CntInst]2629///   PhiX = PHI [InitX, DefX]2630///   CntInst = CntPhi + 12631///   DefX = PhiX >> 12632///   LOOP_BODY2633///   Br: loop if (DefX != 0)2634/// Use(CntPhi) or Use(CntInst)2635///2636/// Into:2637/// If CntPhi used outside the loop:2638///   CountPrev = BitWidth(InitX) - CTLZ(InitX >> 1)2639///   Count = CountPrev + 12640/// else2641///   Count = BitWidth(InitX) - CTLZ(InitX)2642/// loop:2643///   CntPhi = PHI [Cnt0, CntInst]2644///   PhiX = PHI [InitX, DefX]2645///   PhiCount = PHI [Count, Dec]2646///   CntInst = CntPhi + 12647///   DefX = PhiX >> 12648///   Dec = PhiCount - 12649///   LOOP_BODY2650///   Br: loop if (Dec != 0)2651/// Use(CountPrev + Cnt0) // Use(CntPhi)2652/// or2653/// Use(Count + Cnt0) // Use(CntInst)2654///2655/// If LOOP_BODY is empty the loop will be deleted.2656/// If CntInst and DefX are not used in LOOP_BODY they will be removed.2657void LoopIdiomRecognize::transformLoopToCountable(2658    Intrinsic::ID IntrinID, BasicBlock *Preheader, Instruction *CntInst,2659    PHINode *CntPhi, Value *InitX, Instruction *DefX, const DebugLoc &DL,2660    bool ZeroCheck, bool IsCntPhiUsedOutsideLoop, bool InsertSub) {2661  BranchInst *PreheaderBr = cast<BranchInst>(Preheader->getTerminator());2662 2663  // Step 1: Insert the CTLZ/CTTZ instruction at the end of the preheader block2664  IRBuilder<> Builder(PreheaderBr);2665  Builder.SetCurrentDebugLocation(DL);2666 2667  // If there are no uses of CntPhi crate:2668  //   Count = BitWidth - CTLZ(InitX);2669  //   NewCount = Count;2670  // If there are uses of CntPhi create:2671  //   NewCount = BitWidth - CTLZ(InitX >> 1);2672  //   Count = NewCount + 1;2673  Value *InitXNext;2674  if (IsCntPhiUsedOutsideLoop) {2675    if (DefX->getOpcode() == Instruction::AShr)2676      InitXNext = Builder.CreateAShr(InitX, 1);2677    else if (DefX->getOpcode() == Instruction::LShr)2678      InitXNext = Builder.CreateLShr(InitX, 1);2679    else if (DefX->getOpcode() == Instruction::Shl) // cttz2680      InitXNext = Builder.CreateShl(InitX, 1);2681    else2682      llvm_unreachable("Unexpected opcode!");2683  } else2684    InitXNext = InitX;2685  Value *Count =2686      createFFSIntrinsic(Builder, InitXNext, DL, ZeroCheck, IntrinID);2687  Type *CountTy = Count->getType();2688  Count = Builder.CreateSub(2689      ConstantInt::get(CountTy, CountTy->getIntegerBitWidth()), Count);2690  if (InsertSub)2691    Count = Builder.CreateSub(Count, ConstantInt::get(CountTy, 1));2692  Value *NewCount = Count;2693  if (IsCntPhiUsedOutsideLoop)2694    Count = Builder.CreateAdd(Count, ConstantInt::get(CountTy, 1));2695 2696  NewCount = Builder.CreateZExtOrTrunc(NewCount, CntInst->getType());2697 2698  Value *CntInitVal = CntPhi->getIncomingValueForBlock(Preheader);2699  if (cast<ConstantInt>(CntInst->getOperand(1))->isOne()) {2700    // If the counter was being incremented in the loop, add NewCount to the2701    // counter's initial value, but only if the initial value is not zero.2702    ConstantInt *InitConst = dyn_cast<ConstantInt>(CntInitVal);2703    if (!InitConst || !InitConst->isZero())2704      NewCount = Builder.CreateAdd(NewCount, CntInitVal);2705  } else {2706    // If the count was being decremented in the loop, subtract NewCount from2707    // the counter's initial value.2708    NewCount = Builder.CreateSub(CntInitVal, NewCount);2709  }2710 2711  // Step 2: Insert new IV and loop condition:2712  // loop:2713  //   ...2714  //   PhiCount = PHI [Count, Dec]2715  //   ...2716  //   Dec = PhiCount - 12717  //   ...2718  //   Br: loop if (Dec != 0)2719  BasicBlock *Body = *(CurLoop->block_begin());2720  auto *LbBr = cast<BranchInst>(Body->getTerminator());2721  ICmpInst *LbCond = cast<ICmpInst>(LbBr->getCondition());2722 2723  PHINode *TcPhi = PHINode::Create(CountTy, 2, "tcphi");2724  TcPhi->insertBefore(Body->begin());2725 2726  Builder.SetInsertPoint(LbCond);2727  Instruction *TcDec = cast<Instruction>(Builder.CreateSub(2728      TcPhi, ConstantInt::get(CountTy, 1), "tcdec", false, true));2729 2730  TcPhi->addIncoming(Count, Preheader);2731  TcPhi->addIncoming(TcDec, Body);2732 2733  CmpInst::Predicate Pred =2734      (LbBr->getSuccessor(0) == Body) ? CmpInst::ICMP_NE : CmpInst::ICMP_EQ;2735  LbCond->setPredicate(Pred);2736  LbCond->setOperand(0, TcDec);2737  LbCond->setOperand(1, ConstantInt::get(CountTy, 0));2738 2739  // Step 3: All the references to the original counter outside2740  //  the loop are replaced with the NewCount2741  if (IsCntPhiUsedOutsideLoop)2742    CntPhi->replaceUsesOutsideBlock(NewCount, Body);2743  else2744    CntInst->replaceUsesOutsideBlock(NewCount, Body);2745 2746  // step 4: Forget the "non-computable" trip-count SCEV associated with the2747  //   loop. The loop would otherwise not be deleted even if it becomes empty.2748  SE->forgetLoop(CurLoop);2749}2750 2751void LoopIdiomRecognize::transformLoopToPopcount(BasicBlock *PreCondBB,2752                                                 Instruction *CntInst,2753                                                 PHINode *CntPhi, Value *Var) {2754  BasicBlock *PreHead = CurLoop->getLoopPreheader();2755  auto *PreCondBr = cast<BranchInst>(PreCondBB->getTerminator());2756  const DebugLoc &DL = CntInst->getDebugLoc();2757 2758  // Assuming before transformation, the loop is following:2759  //  if (x) // the precondition2760  //     do { cnt++; x &= x - 1; } while(x);2761 2762  // Step 1: Insert the ctpop instruction at the end of the precondition block2763  IRBuilder<> Builder(PreCondBr);2764  Value *PopCnt, *PopCntZext, *NewCount, *TripCnt;2765  {2766    PopCnt = createPopcntIntrinsic(Builder, Var, DL);2767    NewCount = PopCntZext =2768        Builder.CreateZExtOrTrunc(PopCnt, cast<IntegerType>(CntPhi->getType()));2769 2770    if (NewCount != PopCnt)2771      (cast<Instruction>(NewCount))->setDebugLoc(DL);2772 2773    // TripCnt is exactly the number of iterations the loop has2774    TripCnt = NewCount;2775 2776    // If the population counter's initial value is not zero, insert Add Inst.2777    Value *CntInitVal = CntPhi->getIncomingValueForBlock(PreHead);2778    ConstantInt *InitConst = dyn_cast<ConstantInt>(CntInitVal);2779    if (!InitConst || !InitConst->isZero()) {2780      NewCount = Builder.CreateAdd(NewCount, CntInitVal);2781      (cast<Instruction>(NewCount))->setDebugLoc(DL);2782    }2783  }2784 2785  // Step 2: Replace the precondition from "if (x == 0) goto loop-exit" to2786  //   "if (NewCount == 0) loop-exit". Without this change, the intrinsic2787  //   function would be partial dead code, and downstream passes will drag2788  //   it back from the precondition block to the preheader.2789  {2790    ICmpInst *PreCond = cast<ICmpInst>(PreCondBr->getCondition());2791 2792    Value *Opnd0 = PopCntZext;2793    Value *Opnd1 = ConstantInt::get(PopCntZext->getType(), 0);2794    if (PreCond->getOperand(0) != Var)2795      std::swap(Opnd0, Opnd1);2796 2797    ICmpInst *NewPreCond = cast<ICmpInst>(2798        Builder.CreateICmp(PreCond->getPredicate(), Opnd0, Opnd1));2799    PreCondBr->setCondition(NewPreCond);2800 2801    RecursivelyDeleteTriviallyDeadInstructions(PreCond, TLI);2802  }2803 2804  // Step 3: Note that the population count is exactly the trip count of the2805  // loop in question, which enable us to convert the loop from noncountable2806  // loop into a countable one. The benefit is twofold:2807  //2808  //  - If the loop only counts population, the entire loop becomes dead after2809  //    the transformation. It is a lot easier to prove a countable loop dead2810  //    than to prove a noncountable one. (In some C dialects, an infinite loop2811  //    isn't dead even if it computes nothing useful. In general, DCE needs2812  //    to prove a noncountable loop finite before safely delete it.)2813  //2814  //  - If the loop also performs something else, it remains alive.2815  //    Since it is transformed to countable form, it can be aggressively2816  //    optimized by some optimizations which are in general not applicable2817  //    to a noncountable loop.2818  //2819  // After this step, this loop (conceptually) would look like following:2820  //   newcnt = __builtin_ctpop(x);2821  //   t = newcnt;2822  //   if (x)2823  //     do { cnt++; x &= x-1; t--) } while (t > 0);2824  BasicBlock *Body = *(CurLoop->block_begin());2825  {2826    auto *LbBr = cast<BranchInst>(Body->getTerminator());2827    ICmpInst *LbCond = cast<ICmpInst>(LbBr->getCondition());2828    Type *Ty = TripCnt->getType();2829 2830    PHINode *TcPhi = PHINode::Create(Ty, 2, "tcphi");2831    TcPhi->insertBefore(Body->begin());2832 2833    Builder.SetInsertPoint(LbCond);2834    Instruction *TcDec = cast<Instruction>(2835        Builder.CreateSub(TcPhi, ConstantInt::get(Ty, 1),2836                          "tcdec", false, true));2837 2838    TcPhi->addIncoming(TripCnt, PreHead);2839    TcPhi->addIncoming(TcDec, Body);2840 2841    CmpInst::Predicate Pred =2842        (LbBr->getSuccessor(0) == Body) ? CmpInst::ICMP_UGT : CmpInst::ICMP_SLE;2843    LbCond->setPredicate(Pred);2844    LbCond->setOperand(0, TcDec);2845    LbCond->setOperand(1, ConstantInt::get(Ty, 0));2846  }2847 2848  // Step 4: All the references to the original population counter outside2849  //  the loop are replaced with the NewCount -- the value returned from2850  //  __builtin_ctpop().2851  CntInst->replaceUsesOutsideBlock(NewCount, Body);2852 2853  // step 5: Forget the "non-computable" trip-count SCEV associated with the2854  //   loop. The loop would otherwise not be deleted even if it becomes empty.2855  SE->forgetLoop(CurLoop);2856}2857 2858/// Match loop-invariant value.2859template <typename SubPattern_t> struct match_LoopInvariant {2860  SubPattern_t SubPattern;2861  const Loop *L;2862 2863  match_LoopInvariant(const SubPattern_t &SP, const Loop *L)2864      : SubPattern(SP), L(L) {}2865 2866  template <typename ITy> bool match(ITy *V) const {2867    return L->isLoopInvariant(V) && SubPattern.match(V);2868  }2869};2870 2871/// Matches if the value is loop-invariant.2872template <typename Ty>2873inline match_LoopInvariant<Ty> m_LoopInvariant(const Ty &M, const Loop *L) {2874  return match_LoopInvariant<Ty>(M, L);2875}2876 2877/// Return true if the idiom is detected in the loop.2878///2879/// The core idiom we are trying to detect is:2880/// \code2881///   entry:2882///     <...>2883///     %bitmask = shl i32 1, %bitpos2884///     br label %loop2885///2886///   loop:2887///     %x.curr = phi i32 [ %x, %entry ], [ %x.next, %loop ]2888///     %x.curr.bitmasked = and i32 %x.curr, %bitmask2889///     %x.curr.isbitunset = icmp eq i32 %x.curr.bitmasked, 02890///     %x.next = shl i32 %x.curr, 12891///     <...>2892///     br i1 %x.curr.isbitunset, label %loop, label %end2893///2894///   end:2895///     %x.curr.res = phi i32 [ %x.curr, %loop ] <...>2896///     %x.next.res = phi i32 [ %x.next, %loop ] <...>2897///     <...>2898/// \endcode2899static bool detectShiftUntilBitTestIdiom(Loop *CurLoop, Value *&BaseX,2900                                         Value *&BitMask, Value *&BitPos,2901                                         Value *&CurrX, Instruction *&NextX) {2902  LLVM_DEBUG(dbgs() << DEBUG_TYPE2903             " Performing shift-until-bittest idiom detection.\n");2904 2905  // Give up if the loop has multiple blocks or multiple backedges.2906  if (CurLoop->getNumBlocks() != 1 || CurLoop->getNumBackEdges() != 1) {2907    LLVM_DEBUG(dbgs() << DEBUG_TYPE " Bad block/backedge count.\n");2908    return false;2909  }2910 2911  BasicBlock *LoopHeaderBB = CurLoop->getHeader();2912  BasicBlock *LoopPreheaderBB = CurLoop->getLoopPreheader();2913  assert(LoopPreheaderBB && "There is always a loop preheader.");2914 2915  using namespace PatternMatch;2916 2917  // Step 1: Check if the loop backedge is in desirable form.2918 2919  CmpPredicate Pred;2920  Value *CmpLHS, *CmpRHS;2921  BasicBlock *TrueBB, *FalseBB;2922  if (!match(LoopHeaderBB->getTerminator(),2923             m_Br(m_ICmp(Pred, m_Value(CmpLHS), m_Value(CmpRHS)),2924                  m_BasicBlock(TrueBB), m_BasicBlock(FalseBB)))) {2925    LLVM_DEBUG(dbgs() << DEBUG_TYPE " Bad backedge structure.\n");2926    return false;2927  }2928 2929  // Step 2: Check if the backedge's condition is in desirable form.2930 2931  auto MatchVariableBitMask = [&]() {2932    return ICmpInst::isEquality(Pred) && match(CmpRHS, m_Zero()) &&2933           match(CmpLHS,2934                 m_c_And(m_Value(CurrX),2935                         m_CombineAnd(2936                             m_Value(BitMask),2937                             m_LoopInvariant(m_Shl(m_One(), m_Value(BitPos)),2938                                             CurLoop))));2939  };2940 2941  auto MatchDecomposableConstantBitMask = [&]() {2942    auto Res = llvm::decomposeBitTestICmp(2943        CmpLHS, CmpRHS, Pred, /*LookThroughTrunc=*/true,2944        /*AllowNonZeroC=*/false, /*DecomposeAnd=*/true);2945    if (Res && Res->Mask.isPowerOf2()) {2946      assert(ICmpInst::isEquality(Res->Pred));2947      Pred = Res->Pred;2948      CurrX = Res->X;2949      BitMask = ConstantInt::get(CurrX->getType(), Res->Mask);2950      BitPos = ConstantInt::get(CurrX->getType(), Res->Mask.logBase2());2951      return true;2952    }2953    return false;2954  };2955 2956  if (!MatchVariableBitMask() && !MatchDecomposableConstantBitMask()) {2957    LLVM_DEBUG(dbgs() << DEBUG_TYPE " Bad backedge comparison.\n");2958    return false;2959  }2960 2961  // Step 3: Check if the recurrence is in desirable form.2962  auto *CurrXPN = dyn_cast<PHINode>(CurrX);2963  if (!CurrXPN || CurrXPN->getParent() != LoopHeaderBB) {2964    LLVM_DEBUG(dbgs() << DEBUG_TYPE " Not an expected PHI node.\n");2965    return false;2966  }2967 2968  BaseX = CurrXPN->getIncomingValueForBlock(LoopPreheaderBB);2969  NextX =2970      dyn_cast<Instruction>(CurrXPN->getIncomingValueForBlock(LoopHeaderBB));2971 2972  assert(CurLoop->isLoopInvariant(BaseX) &&2973         "Expected BaseX to be available in the preheader!");2974 2975  if (!NextX || !match(NextX, m_Shl(m_Specific(CurrX), m_One()))) {2976    // FIXME: support right-shift?2977    LLVM_DEBUG(dbgs() << DEBUG_TYPE " Bad recurrence.\n");2978    return false;2979  }2980 2981  // Step 4: Check if the backedge's destinations are in desirable form.2982 2983  assert(ICmpInst::isEquality(Pred) &&2984         "Should only get equality predicates here.");2985 2986  // cmp-br is commutative, so canonicalize to a single variant.2987  if (Pred != ICmpInst::Predicate::ICMP_EQ) {2988    Pred = ICmpInst::getInversePredicate(Pred);2989    std::swap(TrueBB, FalseBB);2990  }2991 2992  // We expect to exit loop when comparison yields false,2993  // so when it yields true we should branch back to loop header.2994  if (TrueBB != LoopHeaderBB) {2995    LLVM_DEBUG(dbgs() << DEBUG_TYPE " Bad backedge flow.\n");2996    return false;2997  }2998 2999  // Okay, idiom checks out.3000  return true;3001}3002 3003/// Look for the following loop:3004/// \code3005///   entry:3006///     <...>3007///     %bitmask = shl i32 1, %bitpos3008///     br label %loop3009///3010///   loop:3011///     %x.curr = phi i32 [ %x, %entry ], [ %x.next, %loop ]3012///     %x.curr.bitmasked = and i32 %x.curr, %bitmask3013///     %x.curr.isbitunset = icmp eq i32 %x.curr.bitmasked, 03014///     %x.next = shl i32 %x.curr, 13015///     <...>3016///     br i1 %x.curr.isbitunset, label %loop, label %end3017///3018///   end:3019///     %x.curr.res = phi i32 [ %x.curr, %loop ] <...>3020///     %x.next.res = phi i32 [ %x.next, %loop ] <...>3021///     <...>3022/// \endcode3023///3024/// And transform it into:3025/// \code3026///   entry:3027///     %bitmask = shl i32 1, %bitpos3028///     %lowbitmask = add i32 %bitmask, -13029///     %mask = or i32 %lowbitmask, %bitmask3030///     %x.masked = and i32 %x, %mask3031///     %x.masked.numleadingzeros = call i32 @llvm.ctlz.i32(i32 %x.masked,3032///                                                         i1 true)3033///     %x.masked.numactivebits = sub i32 32, %x.masked.numleadingzeros3034///     %x.masked.leadingonepos = add i32 %x.masked.numactivebits, -13035///     %backedgetakencount = sub i32 %bitpos, %x.masked.leadingonepos3036///     %tripcount = add i32 %backedgetakencount, 13037///     %x.curr = shl i32 %x, %backedgetakencount3038///     %x.next = shl i32 %x, %tripcount3039///     br label %loop3040///3041///   loop:3042///     %loop.iv = phi i32 [ 0, %entry ], [ %loop.iv.next, %loop ]3043///     %loop.iv.next = add nuw i32 %loop.iv, 13044///     %loop.ivcheck = icmp eq i32 %loop.iv.next, %tripcount3045///     <...>3046///     br i1 %loop.ivcheck, label %end, label %loop3047///3048///   end:3049///     %x.curr.res = phi i32 [ %x.curr, %loop ] <...>3050///     %x.next.res = phi i32 [ %x.next, %loop ] <...>3051///     <...>3052/// \endcode3053bool LoopIdiomRecognize::recognizeShiftUntilBitTest() {3054  bool MadeChange = false;3055 3056  Value *X, *BitMask, *BitPos, *XCurr;3057  Instruction *XNext;3058  if (!detectShiftUntilBitTestIdiom(CurLoop, X, BitMask, BitPos, XCurr,3059                                    XNext)) {3060    LLVM_DEBUG(dbgs() << DEBUG_TYPE3061               " shift-until-bittest idiom detection failed.\n");3062    return MadeChange;3063  }3064  LLVM_DEBUG(dbgs() << DEBUG_TYPE " shift-until-bittest idiom detected!\n");3065 3066  // Ok, it is the idiom we were looking for, we *could* transform this loop,3067  // but is it profitable to transform?3068 3069  BasicBlock *LoopHeaderBB = CurLoop->getHeader();3070  BasicBlock *LoopPreheaderBB = CurLoop->getLoopPreheader();3071  assert(LoopPreheaderBB && "There is always a loop preheader.");3072 3073  BasicBlock *SuccessorBB = CurLoop->getExitBlock();3074  assert(SuccessorBB && "There is only a single successor.");3075 3076  IRBuilder<> Builder(LoopPreheaderBB->getTerminator());3077  Builder.SetCurrentDebugLocation(cast<Instruction>(XCurr)->getDebugLoc());3078 3079  Intrinsic::ID IntrID = Intrinsic::ctlz;3080  Type *Ty = X->getType();3081  unsigned Bitwidth = Ty->getScalarSizeInBits();3082 3083  TargetTransformInfo::TargetCostKind CostKind =3084      TargetTransformInfo::TCK_SizeAndLatency;3085 3086  // The rewrite is considered to be unprofitable iff and only iff the3087  // intrinsic/shift we'll use are not cheap. Note that we are okay with *just*3088  // making the loop countable, even if nothing else changes.3089  IntrinsicCostAttributes Attrs(3090      IntrID, Ty, {PoisonValue::get(Ty), /*is_zero_poison=*/Builder.getTrue()});3091  InstructionCost Cost = TTI->getIntrinsicInstrCost(Attrs, CostKind);3092  if (Cost > TargetTransformInfo::TCC_Basic) {3093    LLVM_DEBUG(dbgs() << DEBUG_TYPE3094               " Intrinsic is too costly, not beneficial\n");3095    return MadeChange;3096  }3097  if (TTI->getArithmeticInstrCost(Instruction::Shl, Ty, CostKind) >3098      TargetTransformInfo::TCC_Basic) {3099    LLVM_DEBUG(dbgs() << DEBUG_TYPE " Shift is too costly, not beneficial\n");3100    return MadeChange;3101  }3102 3103  // Ok, transform appears worthwhile.3104  MadeChange = true;3105 3106  if (!isGuaranteedNotToBeUndefOrPoison(BitPos)) {3107    // BitMask may be computed from BitPos, Freeze BitPos so we can increase3108    // it's use count.3109    std::optional<BasicBlock::iterator> InsertPt = std::nullopt;3110    if (auto *BitPosI = dyn_cast<Instruction>(BitPos))3111      InsertPt = BitPosI->getInsertionPointAfterDef();3112    else3113      InsertPt = DT->getRoot()->getFirstNonPHIOrDbgOrAlloca();3114    if (!InsertPt)3115      return false;3116    FreezeInst *BitPosFrozen =3117        new FreezeInst(BitPos, BitPos->getName() + ".fr", *InsertPt);3118    BitPos->replaceUsesWithIf(BitPosFrozen, [BitPosFrozen](Use &U) {3119      return U.getUser() != BitPosFrozen;3120    });3121    BitPos = BitPosFrozen;3122  }3123 3124  // Step 1: Compute the loop trip count.3125 3126  Value *LowBitMask = Builder.CreateAdd(BitMask, Constant::getAllOnesValue(Ty),3127                                        BitPos->getName() + ".lowbitmask");3128  Value *Mask =3129      Builder.CreateOr(LowBitMask, BitMask, BitPos->getName() + ".mask");3130  Value *XMasked = Builder.CreateAnd(X, Mask, X->getName() + ".masked");3131  CallInst *XMaskedNumLeadingZeros = Builder.CreateIntrinsic(3132      IntrID, Ty, {XMasked, /*is_zero_poison=*/Builder.getTrue()},3133      /*FMFSource=*/nullptr, XMasked->getName() + ".numleadingzeros");3134  Value *XMaskedNumActiveBits = Builder.CreateSub(3135      ConstantInt::get(Ty, Ty->getScalarSizeInBits()), XMaskedNumLeadingZeros,3136      XMasked->getName() + ".numactivebits", /*HasNUW=*/true,3137      /*HasNSW=*/Bitwidth != 2);3138  Value *XMaskedLeadingOnePos =3139      Builder.CreateAdd(XMaskedNumActiveBits, Constant::getAllOnesValue(Ty),3140                        XMasked->getName() + ".leadingonepos", /*HasNUW=*/false,3141                        /*HasNSW=*/Bitwidth > 2);3142 3143  Value *LoopBackedgeTakenCount = Builder.CreateSub(3144      BitPos, XMaskedLeadingOnePos, CurLoop->getName() + ".backedgetakencount",3145      /*HasNUW=*/true, /*HasNSW=*/true);3146  // We know loop's backedge-taken count, but what's loop's trip count?3147  // Note that while NUW is always safe, while NSW is only for bitwidths != 2.3148  Value *LoopTripCount =3149      Builder.CreateAdd(LoopBackedgeTakenCount, ConstantInt::get(Ty, 1),3150                        CurLoop->getName() + ".tripcount", /*HasNUW=*/true,3151                        /*HasNSW=*/Bitwidth != 2);3152 3153  // Step 2: Compute the recurrence's final value without a loop.3154 3155  // NewX is always safe to compute, because `LoopBackedgeTakenCount`3156  // will always be smaller than `bitwidth(X)`, i.e. we never get poison.3157  Value *NewX = Builder.CreateShl(X, LoopBackedgeTakenCount);3158  NewX->takeName(XCurr);3159  if (auto *I = dyn_cast<Instruction>(NewX))3160    I->copyIRFlags(XNext, /*IncludeWrapFlags=*/true);3161 3162  Value *NewXNext;3163  // Rewriting XNext is more complicated, however, because `X << LoopTripCount`3164  // will be poison iff `LoopTripCount == bitwidth(X)` (which will happen3165  // iff `BitPos` is `bitwidth(x) - 1` and `X` is `1`). So unless we know3166  // that isn't the case, we'll need to emit an alternative, safe IR.3167  if (XNext->hasNoSignedWrap() || XNext->hasNoUnsignedWrap() ||3168      PatternMatch::match(3169          BitPos, PatternMatch::m_SpecificInt_ICMP(3170                      ICmpInst::ICMP_NE, APInt(Ty->getScalarSizeInBits(),3171                                               Ty->getScalarSizeInBits() - 1))))3172    NewXNext = Builder.CreateShl(X, LoopTripCount);3173  else {3174    // Otherwise, just additionally shift by one. It's the smallest solution,3175    // alternatively, we could check that NewX is INT_MIN (or BitPos is )3176    // and select 0 instead.3177    NewXNext = Builder.CreateShl(NewX, ConstantInt::get(Ty, 1));3178  }3179 3180  NewXNext->takeName(XNext);3181  if (auto *I = dyn_cast<Instruction>(NewXNext))3182    I->copyIRFlags(XNext, /*IncludeWrapFlags=*/true);3183 3184  // Step 3: Adjust the successor basic block to recieve the computed3185  //         recurrence's final value instead of the recurrence itself.3186 3187  XCurr->replaceUsesOutsideBlock(NewX, LoopHeaderBB);3188  XNext->replaceUsesOutsideBlock(NewXNext, LoopHeaderBB);3189 3190  // Step 4: Rewrite the loop into a countable form, with canonical IV.3191 3192  // The new canonical induction variable.3193  Builder.SetInsertPoint(LoopHeaderBB, LoopHeaderBB->begin());3194  auto *IV = Builder.CreatePHI(Ty, 2, CurLoop->getName() + ".iv");3195 3196  // The induction itself.3197  // Note that while NUW is always safe, while NSW is only for bitwidths != 2.3198  Builder.SetInsertPoint(LoopHeaderBB->getTerminator());3199  auto *IVNext =3200      Builder.CreateAdd(IV, ConstantInt::get(Ty, 1), IV->getName() + ".next",3201                        /*HasNUW=*/true, /*HasNSW=*/Bitwidth != 2);3202 3203  // The loop trip count check.3204  auto *IVCheck = Builder.CreateICmpEQ(IVNext, LoopTripCount,3205                                       CurLoop->getName() + ".ivcheck");3206  SmallVector<uint32_t> BranchWeights;3207  const bool HasBranchWeights =3208      !ProfcheckDisableMetadataFixes &&3209      extractBranchWeights(*LoopHeaderBB->getTerminator(), BranchWeights);3210 3211  auto *BI = Builder.CreateCondBr(IVCheck, SuccessorBB, LoopHeaderBB);3212  if (HasBranchWeights) {3213    if (SuccessorBB == LoopHeaderBB->getTerminator()->getSuccessor(1))3214      std::swap(BranchWeights[0], BranchWeights[1]);3215    // We're not changing the loop profile, so we can reuse the original loop's3216    // profile.3217    setBranchWeights(*BI, BranchWeights,3218                     /*IsExpected=*/false);3219  }3220 3221  LoopHeaderBB->getTerminator()->eraseFromParent();3222 3223  // Populate the IV PHI.3224  IV->addIncoming(ConstantInt::get(Ty, 0), LoopPreheaderBB);3225  IV->addIncoming(IVNext, LoopHeaderBB);3226 3227  // Step 5: Forget the "non-computable" trip-count SCEV associated with the3228  //   loop. The loop would otherwise not be deleted even if it becomes empty.3229 3230  SE->forgetLoop(CurLoop);3231 3232  // Other passes will take care of actually deleting the loop if possible.3233 3234  LLVM_DEBUG(dbgs() << DEBUG_TYPE " shift-until-bittest idiom optimized!\n");3235 3236  ++NumShiftUntilBitTest;3237  return MadeChange;3238}3239 3240/// Return true if the idiom is detected in the loop.3241///3242/// The core idiom we are trying to detect is:3243/// \code3244///   entry:3245///     <...>3246///     %start = <...>3247///     %extraoffset = <...>3248///     <...>3249///     br label %for.cond3250///3251///   loop:3252///     %iv = phi i8 [ %start, %entry ], [ %iv.next, %for.cond ]3253///     %nbits = add nsw i8 %iv, %extraoffset3254///     %val.shifted = {{l,a}shr,shl} i8 %val, %nbits3255///     %val.shifted.iszero = icmp eq i8 %val.shifted, 03256///     %iv.next = add i8 %iv, 13257///     <...>3258///     br i1 %val.shifted.iszero, label %end, label %loop3259///3260///   end:3261///     %iv.res = phi i8 [ %iv, %loop ] <...>3262///     %nbits.res = phi i8 [ %nbits, %loop ] <...>3263///     %val.shifted.res = phi i8 [ %val.shifted, %loop ] <...>3264///     %val.shifted.iszero.res = phi i1 [ %val.shifted.iszero, %loop ] <...>3265///     %iv.next.res = phi i8 [ %iv.next, %loop ] <...>3266///     <...>3267/// \endcode3268static bool detectShiftUntilZeroIdiom(Loop *CurLoop, ScalarEvolution *SE,3269                                      Instruction *&ValShiftedIsZero,3270                                      Intrinsic::ID &IntrinID, Instruction *&IV,3271                                      Value *&Start, Value *&Val,3272                                      const SCEV *&ExtraOffsetExpr,3273                                      bool &InvertedCond) {3274  LLVM_DEBUG(dbgs() << DEBUG_TYPE3275             " Performing shift-until-zero idiom detection.\n");3276 3277  // Give up if the loop has multiple blocks or multiple backedges.3278  if (CurLoop->getNumBlocks() != 1 || CurLoop->getNumBackEdges() != 1) {3279    LLVM_DEBUG(dbgs() << DEBUG_TYPE " Bad block/backedge count.\n");3280    return false;3281  }3282 3283  Instruction *ValShifted, *NBits, *IVNext;3284  Value *ExtraOffset;3285 3286  BasicBlock *LoopHeaderBB = CurLoop->getHeader();3287  BasicBlock *LoopPreheaderBB = CurLoop->getLoopPreheader();3288  assert(LoopPreheaderBB && "There is always a loop preheader.");3289 3290  using namespace PatternMatch;3291 3292  // Step 1: Check if the loop backedge, condition is in desirable form.3293 3294  CmpPredicate Pred;3295  BasicBlock *TrueBB, *FalseBB;3296  if (!match(LoopHeaderBB->getTerminator(),3297             m_Br(m_Instruction(ValShiftedIsZero), m_BasicBlock(TrueBB),3298                  m_BasicBlock(FalseBB))) ||3299      !match(ValShiftedIsZero,3300             m_ICmp(Pred, m_Instruction(ValShifted), m_Zero())) ||3301      !ICmpInst::isEquality(Pred)) {3302    LLVM_DEBUG(dbgs() << DEBUG_TYPE " Bad backedge structure.\n");3303    return false;3304  }3305 3306  // Step 2: Check if the comparison's operand is in desirable form.3307  // FIXME: Val could be a one-input PHI node, which we should look past.3308  if (!match(ValShifted, m_Shift(m_LoopInvariant(m_Value(Val), CurLoop),3309                                 m_Instruction(NBits)))) {3310    LLVM_DEBUG(dbgs() << DEBUG_TYPE " Bad comparisons value computation.\n");3311    return false;3312  }3313  IntrinID = ValShifted->getOpcode() == Instruction::Shl ? Intrinsic::cttz3314                                                         : Intrinsic::ctlz;3315 3316  // Step 3: Check if the shift amount is in desirable form.3317 3318  if (match(NBits, m_c_Add(m_Instruction(IV),3319                           m_LoopInvariant(m_Value(ExtraOffset), CurLoop))) &&3320      (NBits->hasNoSignedWrap() || NBits->hasNoUnsignedWrap()))3321    ExtraOffsetExpr = SE->getNegativeSCEV(SE->getSCEV(ExtraOffset));3322  else if (match(NBits,3323                 m_Sub(m_Instruction(IV),3324                       m_LoopInvariant(m_Value(ExtraOffset), CurLoop))) &&3325           NBits->hasNoSignedWrap())3326    ExtraOffsetExpr = SE->getSCEV(ExtraOffset);3327  else {3328    IV = NBits;3329    ExtraOffsetExpr = SE->getZero(NBits->getType());3330  }3331 3332  // Step 4: Check if the recurrence is in desirable form.3333  auto *IVPN = dyn_cast<PHINode>(IV);3334  if (!IVPN || IVPN->getParent() != LoopHeaderBB) {3335    LLVM_DEBUG(dbgs() << DEBUG_TYPE " Not an expected PHI node.\n");3336    return false;3337  }3338 3339  Start = IVPN->getIncomingValueForBlock(LoopPreheaderBB);3340  IVNext = dyn_cast<Instruction>(IVPN->getIncomingValueForBlock(LoopHeaderBB));3341 3342  if (!IVNext || !match(IVNext, m_Add(m_Specific(IVPN), m_One()))) {3343    LLVM_DEBUG(dbgs() << DEBUG_TYPE " Bad recurrence.\n");3344    return false;3345  }3346 3347  // Step 4: Check if the backedge's destinations are in desirable form.3348 3349  assert(ICmpInst::isEquality(Pred) &&3350         "Should only get equality predicates here.");3351 3352  // cmp-br is commutative, so canonicalize to a single variant.3353  InvertedCond = Pred != ICmpInst::Predicate::ICMP_EQ;3354  if (InvertedCond) {3355    Pred = ICmpInst::getInversePredicate(Pred);3356    std::swap(TrueBB, FalseBB);3357  }3358 3359  // We expect to exit loop when comparison yields true,3360  // so when it yields false we should branch back to loop header.3361  if (FalseBB != LoopHeaderBB) {3362    LLVM_DEBUG(dbgs() << DEBUG_TYPE " Bad backedge flow.\n");3363    return false;3364  }3365 3366  // The new, countable, loop will certainly only run a known number of3367  // iterations, It won't be infinite. But the old loop might be infinite3368  // under certain conditions. For logical shifts, the value will become zero3369  // after at most bitwidth(%Val) loop iterations. However, for arithmetic3370  // right-shift, iff the sign bit was set, the value will never become zero,3371  // and the loop may never finish.3372  if (ValShifted->getOpcode() == Instruction::AShr &&3373      !isMustProgress(CurLoop) && !SE->isKnownNonNegative(SE->getSCEV(Val))) {3374    LLVM_DEBUG(dbgs() << DEBUG_TYPE " Can not prove the loop is finite.\n");3375    return false;3376  }3377 3378  // Okay, idiom checks out.3379  return true;3380}3381 3382/// Look for the following loop:3383/// \code3384///   entry:3385///     <...>3386///     %start = <...>3387///     %extraoffset = <...>3388///     <...>3389///     br label %loop3390///3391///   loop:3392///     %iv = phi i8 [ %start, %entry ], [ %iv.next, %loop ]3393///     %nbits = add nsw i8 %iv, %extraoffset3394///     %val.shifted = {{l,a}shr,shl} i8 %val, %nbits3395///     %val.shifted.iszero = icmp eq i8 %val.shifted, 03396///     %iv.next = add i8 %iv, 13397///     <...>3398///     br i1 %val.shifted.iszero, label %end, label %loop3399///3400///   end:3401///     %iv.res = phi i8 [ %iv, %loop ] <...>3402///     %nbits.res = phi i8 [ %nbits, %loop ] <...>3403///     %val.shifted.res = phi i8 [ %val.shifted, %loop ] <...>3404///     %val.shifted.iszero.res = phi i1 [ %val.shifted.iszero, %loop ] <...>3405///     %iv.next.res = phi i8 [ %iv.next, %loop ] <...>3406///     <...>3407/// \endcode3408///3409/// And transform it into:3410/// \code3411///   entry:3412///     <...>3413///     %start = <...>3414///     %extraoffset = <...>3415///     <...>3416///     %val.numleadingzeros = call i8 @llvm.ct{l,t}z.i8(i8 %val, i1 0)3417///     %val.numactivebits = sub i8 8, %val.numleadingzeros3418///     %extraoffset.neg = sub i8 0, %extraoffset3419///     %tmp = add i8 %val.numactivebits, %extraoffset.neg3420///     %iv.final = call i8 @llvm.smax.i8(i8 %tmp, i8 %start)3421///     %loop.tripcount = sub i8 %iv.final, %start3422///     br label %loop3423///3424///   loop:3425///     %loop.iv = phi i8 [ 0, %entry ], [ %loop.iv.next, %loop ]3426///     %loop.iv.next = add i8 %loop.iv, 13427///     %loop.ivcheck = icmp eq i8 %loop.iv.next, %loop.tripcount3428///     %iv = add i8 %loop.iv, %start3429///     <...>3430///     br i1 %loop.ivcheck, label %end, label %loop3431///3432///   end:3433///     %iv.res = phi i8 [ %iv.final, %loop ] <...>3434///     <...>3435/// \endcode3436bool LoopIdiomRecognize::recognizeShiftUntilZero() {3437  bool MadeChange = false;3438 3439  Instruction *ValShiftedIsZero;3440  Intrinsic::ID IntrID;3441  Instruction *IV;3442  Value *Start, *Val;3443  const SCEV *ExtraOffsetExpr;3444  bool InvertedCond;3445  if (!detectShiftUntilZeroIdiom(CurLoop, SE, ValShiftedIsZero, IntrID, IV,3446                                 Start, Val, ExtraOffsetExpr, InvertedCond)) {3447    LLVM_DEBUG(dbgs() << DEBUG_TYPE3448               " shift-until-zero idiom detection failed.\n");3449    return MadeChange;3450  }3451  LLVM_DEBUG(dbgs() << DEBUG_TYPE " shift-until-zero idiom detected!\n");3452 3453  // Ok, it is the idiom we were looking for, we *could* transform this loop,3454  // but is it profitable to transform?3455 3456  BasicBlock *LoopHeaderBB = CurLoop->getHeader();3457  BasicBlock *LoopPreheaderBB = CurLoop->getLoopPreheader();3458  assert(LoopPreheaderBB && "There is always a loop preheader.");3459 3460  BasicBlock *SuccessorBB = CurLoop->getExitBlock();3461  assert(SuccessorBB && "There is only a single successor.");3462 3463  IRBuilder<> Builder(LoopPreheaderBB->getTerminator());3464  Builder.SetCurrentDebugLocation(IV->getDebugLoc());3465 3466  Type *Ty = Val->getType();3467  unsigned Bitwidth = Ty->getScalarSizeInBits();3468 3469  TargetTransformInfo::TargetCostKind CostKind =3470      TargetTransformInfo::TCK_SizeAndLatency;3471 3472  // The rewrite is considered to be unprofitable iff and only iff the3473  // intrinsic we'll use are not cheap. Note that we are okay with *just*3474  // making the loop countable, even if nothing else changes.3475  IntrinsicCostAttributes Attrs(3476      IntrID, Ty, {PoisonValue::get(Ty), /*is_zero_poison=*/Builder.getFalse()});3477  InstructionCost Cost = TTI->getIntrinsicInstrCost(Attrs, CostKind);3478  if (Cost > TargetTransformInfo::TCC_Basic) {3479    LLVM_DEBUG(dbgs() << DEBUG_TYPE3480               " Intrinsic is too costly, not beneficial\n");3481    return MadeChange;3482  }3483 3484  // Ok, transform appears worthwhile.3485  MadeChange = true;3486 3487  bool OffsetIsZero = ExtraOffsetExpr->isZero();3488 3489  // Step 1: Compute the loop's final IV value / trip count.3490 3491  CallInst *ValNumLeadingZeros = Builder.CreateIntrinsic(3492      IntrID, Ty, {Val, /*is_zero_poison=*/Builder.getFalse()},3493      /*FMFSource=*/nullptr, Val->getName() + ".numleadingzeros");3494  Value *ValNumActiveBits = Builder.CreateSub(3495      ConstantInt::get(Ty, Ty->getScalarSizeInBits()), ValNumLeadingZeros,3496      Val->getName() + ".numactivebits", /*HasNUW=*/true,3497      /*HasNSW=*/Bitwidth != 2);3498 3499  SCEVExpander Expander(*SE, *DL, "loop-idiom");3500  Expander.setInsertPoint(&*Builder.GetInsertPoint());3501  Value *ExtraOffset = Expander.expandCodeFor(ExtraOffsetExpr);3502 3503  Value *ValNumActiveBitsOffset = Builder.CreateAdd(3504      ValNumActiveBits, ExtraOffset, ValNumActiveBits->getName() + ".offset",3505      /*HasNUW=*/OffsetIsZero, /*HasNSW=*/true);3506  Value *IVFinal = Builder.CreateIntrinsic(Intrinsic::smax, {Ty},3507                                           {ValNumActiveBitsOffset, Start},3508                                           /*FMFSource=*/nullptr, "iv.final");3509 3510  auto *LoopBackedgeTakenCount = cast<Instruction>(Builder.CreateSub(3511      IVFinal, Start, CurLoop->getName() + ".backedgetakencount",3512      /*HasNUW=*/OffsetIsZero, /*HasNSW=*/true));3513  // FIXME: or when the offset was `add nuw`3514 3515  // We know loop's backedge-taken count, but what's loop's trip count?3516  Value *LoopTripCount =3517      Builder.CreateAdd(LoopBackedgeTakenCount, ConstantInt::get(Ty, 1),3518                        CurLoop->getName() + ".tripcount", /*HasNUW=*/true,3519                        /*HasNSW=*/Bitwidth != 2);3520 3521  // Step 2: Adjust the successor basic block to recieve the original3522  //         induction variable's final value instead of the orig. IV itself.3523 3524  IV->replaceUsesOutsideBlock(IVFinal, LoopHeaderBB);3525 3526  // Step 3: Rewrite the loop into a countable form, with canonical IV.3527 3528  // The new canonical induction variable.3529  Builder.SetInsertPoint(LoopHeaderBB, LoopHeaderBB->begin());3530  auto *CIV = Builder.CreatePHI(Ty, 2, CurLoop->getName() + ".iv");3531 3532  // The induction itself.3533  Builder.SetInsertPoint(LoopHeaderBB, LoopHeaderBB->getFirstNonPHIIt());3534  auto *CIVNext =3535      Builder.CreateAdd(CIV, ConstantInt::get(Ty, 1), CIV->getName() + ".next",3536                        /*HasNUW=*/true, /*HasNSW=*/Bitwidth != 2);3537 3538  // The loop trip count check.3539  auto *CIVCheck = Builder.CreateICmpEQ(CIVNext, LoopTripCount,3540                                        CurLoop->getName() + ".ivcheck");3541  auto *NewIVCheck = CIVCheck;3542  if (InvertedCond) {3543    NewIVCheck = Builder.CreateNot(CIVCheck);3544    NewIVCheck->takeName(ValShiftedIsZero);3545  }3546 3547  // The original IV, but rebased to be an offset to the CIV.3548  auto *IVDePHId = Builder.CreateAdd(CIV, Start, "", /*HasNUW=*/false,3549                                     /*HasNSW=*/true); // FIXME: what about NUW?3550  IVDePHId->takeName(IV);3551 3552  // The loop terminator.3553  Builder.SetInsertPoint(LoopHeaderBB->getTerminator());3554  SmallVector<uint32_t> BranchWeights;3555  const bool HasBranchWeights =3556      !ProfcheckDisableMetadataFixes &&3557      extractBranchWeights(*LoopHeaderBB->getTerminator(), BranchWeights);3558 3559  auto *BI = Builder.CreateCondBr(CIVCheck, SuccessorBB, LoopHeaderBB);3560  if (HasBranchWeights) {3561    if (InvertedCond)3562      std::swap(BranchWeights[0], BranchWeights[1]);3563    // We're not changing the loop profile, so we can reuse the original loop's3564    // profile.3565    setBranchWeights(*BI, BranchWeights, /*IsExpected=*/false);3566  }3567  LoopHeaderBB->getTerminator()->eraseFromParent();3568 3569  // Populate the IV PHI.3570  CIV->addIncoming(ConstantInt::get(Ty, 0), LoopPreheaderBB);3571  CIV->addIncoming(CIVNext, LoopHeaderBB);3572 3573  // Step 4: Forget the "non-computable" trip-count SCEV associated with the3574  //   loop. The loop would otherwise not be deleted even if it becomes empty.3575 3576  SE->forgetLoop(CurLoop);3577 3578  // Step 5: Try to cleanup the loop's body somewhat.3579  IV->replaceAllUsesWith(IVDePHId);3580  IV->eraseFromParent();3581 3582  ValShiftedIsZero->replaceAllUsesWith(NewIVCheck);3583  ValShiftedIsZero->eraseFromParent();3584 3585  // Other passes will take care of actually deleting the loop if possible.3586 3587  LLVM_DEBUG(dbgs() << DEBUG_TYPE " shift-until-zero idiom optimized!\n");3588 3589  ++NumShiftUntilZero;3590  return MadeChange;3591}3592