LLVM 24.0.0git
LoopIdiomRecognize.cpp
Go to the documentation of this file.
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-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This pass implements an idiom recognizer that transforms simple loops into a
10// non-loop form. In cases that this kicks in, it can be a significant
11// performance win.
12//
13// If compiling for code size we avoid idiom recognition if the resulting
14// code could be larger than the code for the original loop. One way this could
15// happen is if the loop is not removable after idiom recognition due to the
16// presence of non-idiom instructions. The initial implementation of the
17// 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 and
26// replace them with calls to BLAS (if linked in??).
27//
28//===----------------------------------------------------------------------===//
29
31#include "ScalarOptions.h"
32#include "llvm/ADT/APInt.h"
33#include "llvm/ADT/ArrayRef.h"
34#include "llvm/ADT/DenseMap.h"
35#include "llvm/ADT/MapVector.h"
36#include "llvm/ADT/STLExtras.h"
37#include "llvm/ADT/SetVector.h"
40#include "llvm/ADT/Statistic.h"
41#include "llvm/ADT/StringRef.h"
59#include "llvm/IR/BasicBlock.h"
60#include "llvm/IR/Constant.h"
61#include "llvm/IR/Constants.h"
62#include "llvm/IR/DataLayout.h"
63#include "llvm/IR/DebugLoc.h"
65#include "llvm/IR/Dominators.h"
66#include "llvm/IR/GlobalValue.h"
68#include "llvm/IR/IRBuilder.h"
69#include "llvm/IR/InstrTypes.h"
70#include "llvm/IR/Instruction.h"
73#include "llvm/IR/Intrinsics.h"
74#include "llvm/IR/LLVMContext.h"
75#include "llvm/IR/Module.h"
76#include "llvm/IR/PassManager.h"
79#include "llvm/IR/Type.h"
80#include "llvm/IR/User.h"
81#include "llvm/IR/Value.h"
82#include "llvm/IR/ValueHandle.h"
85#include "llvm/Support/Debug.h"
92#include <algorithm>
93#include <cassert>
94#include <cstdint>
95#include <utility>
96
97using namespace llvm;
98using namespace SCEVPatternMatch;
99
100#define DEBUG_TYPE "loop-idiom"
101
102STATISTIC(NumMemSet, "Number of memset's formed from loop stores");
103STATISTIC(NumMemCpy, "Number of memcpy's formed from loop load+stores");
104STATISTIC(NumMemMove, "Number of memmove's formed from loop load+stores");
105STATISTIC(NumStrLen, "Number of strlen's and wcslen's formed from loop loads");
107 NumShiftUntilBitTest,
108 "Number of uncountable loops recognized as 'shift until bitttest' idiom");
109STATISTIC(NumShiftUntilZero,
110 "Number of uncountable loops recognized as 'shift until zero' idiom");
111
112namespace llvm {
115 DisableLIRPAll("disable-" DEBUG_TYPE "-all",
116 cl::desc("Options to disable Loop Idiom Recognize Pass."),
119
122 DisableLIRPMemset("disable-" DEBUG_TYPE "-memset",
123 cl::desc("Proceed with loop idiom recognize pass, but do "
124 "not convert loop(s) to memset."),
127
130 DisableLIRPMemcpy("disable-" DEBUG_TYPE "-memcpy",
131 cl::desc("Proceed with loop idiom recognize pass, but do "
132 "not convert loop(s) to memcpy."),
135
138 DisableLIRPStrlen("disable-loop-idiom-strlen",
139 cl::desc("Proceed with loop idiom recognize pass, but do "
140 "not convert loop(s) to strlen."),
143
146 EnableLIRPWcslen("disable-loop-idiom-wcslen",
147 cl::desc("Proceed with loop idiom recognize pass, "
148 "enable conversion of loop(s) to wcslen."),
151
154 DisableLIRPHashRecognize("disable-" DEBUG_TYPE "-hashrecognize",
155 cl::desc("Proceed with loop idiom recognize pass, "
156 "but do not do hash-recognize analysis."),
158 cl::init(false), cl::ReallyHidden);
159
160} // namespace llvm
161
162namespace {
163
164class LoopIdiomRecognize {
165 const ScalarOptions &Opts;
166 Loop *CurLoop = nullptr;
168 DominatorTree *DT;
169 LoopInfo *LI;
170 ScalarEvolution *SE;
173 const DataLayout *DL;
175 bool ApplyCodeSizeHeuristics;
176 std::unique_ptr<MemorySSAUpdater> MSSAU;
177
178public:
179 explicit LoopIdiomRecognize(const ScalarOptions &Opts, AliasAnalysis *AA,
180 DominatorTree *DT, LoopInfo *LI,
182 const TargetTransformInfo *TTI, MemorySSA *MSSA,
183 const DataLayout *DL,
185 : Opts(Opts), AA(AA), DT(DT), LI(LI), SE(SE), TLI(TLI), TTI(TTI), DL(DL),
186 ORE(ORE) {
187 if (MSSA)
188 MSSAU = std::make_unique<MemorySSAUpdater>(MSSA);
189 }
190
191 bool runOnLoop(Loop *L);
192
193private:
194 using StoreList = SmallVector<StoreInst *, 8>;
195 using StoreListMap = MapVector<Value *, StoreList>;
196
197 StoreListMap StoreRefsForMemset;
198 StoreListMap StoreRefsForMemsetPattern;
199 StoreList StoreRefsForMemcpy;
200 bool HasMemset;
201 bool HasMemsetPattern;
202 bool HasMemcpy;
203
204 /// Return code for isLegalStore()
205 enum LegalStoreKind {
206 None = 0,
207 Memset,
208 MemsetPattern,
209 Memcpy,
210 UnorderedAtomicMemcpy,
211 DontUse // Dummy retval never to be used. Allows catching errors in retval
212 // handling.
213 };
214
215 /// \name Countable Loop Idiom Handling
216 /// @{
217
218 bool runOnCountableLoop();
219 bool runOnLoopBlock(BasicBlock *BB, const SCEV *BECount,
220 SmallVectorImpl<BasicBlock *> &ExitBlocks);
221
222 void collectStores(BasicBlock *BB);
223 LegalStoreKind isLegalStore(StoreInst *SI);
224 enum class ForMemset { No, Yes };
225 bool processLoopStores(SmallVectorImpl<StoreInst *> &SL, const SCEV *BECount,
226 ForMemset For);
227
228 template <typename MemInst>
229 bool processLoopMemIntrinsic(
230 BasicBlock *BB,
231 bool (LoopIdiomRecognize::*Processor)(MemInst *, const SCEV *),
232 const SCEV *BECount);
233 bool processLoopMemCpy(MemCpyInst *MCI, const SCEV *BECount);
234 bool processLoopMemSet(MemSetInst *MSI, const SCEV *BECount);
235
236 bool processLoopStridedStore(Value *DestPtr, const SCEV *StoreSizeSCEV,
237 MaybeAlign StoreAlignment, Value *StoredVal,
238 Instruction *TheStore,
239 SmallPtrSetImpl<Instruction *> &Stores,
240 const SCEVAddRecExpr *Ev, const SCEV *BECount,
241 bool IsNegStride, bool IsLoopMemset = false);
242 bool processLoopStoreOfLoopLoad(StoreInst *SI, const SCEV *BECount);
243 bool processLoopStoreOfLoopLoad(Value *DestPtr, Value *SourcePtr,
244 const SCEV *StoreSize, MaybeAlign StoreAlign,
245 MaybeAlign LoadAlign, Instruction *TheStore,
246 Instruction *TheLoad,
247 const SCEVAddRecExpr *StoreEv,
248 const SCEVAddRecExpr *LoadEv,
249 const SCEV *BECount);
250 bool avoidLIRForMultiBlockLoop(bool IsMemset = false,
251 bool IsLoopMemset = false);
252 bool optimizeCRCLoop(const PolynomialInfo &Info);
253 void optimizeCRCLoopUsingClmul(const PolynomialInfo &Info);
254 void optimizeCRCLoopUsingTableLookup(const PolynomialInfo &Info);
255
256 /// @}
257 /// \name Noncountable Loop Idiom Handling
258 /// @{
259
260 bool runOnNoncountableLoop();
261
262 bool recognizePopcount();
263 void transformLoopToPopcount(BasicBlock *PreCondBB, Instruction *CntInst,
264 PHINode *CntPhi, Value *Var);
265 bool isProfitableToInsertFFS(Intrinsic::ID IntrinID, Value *InitX,
266 bool ZeroCheck, size_t CanonicalSize);
267 bool insertFFSIfProfitable(Intrinsic::ID IntrinID, Value *InitX,
268 Instruction *DefX, PHINode *CntPhi,
269 Instruction *CntInst);
270 bool recognizeAndInsertFFS(); /// Find First Set: ctlz or cttz
271 bool recognizeShiftUntilLessThan();
272 void transformLoopToCountable(Intrinsic::ID IntrinID, BasicBlock *PreCondBB,
273 Instruction *CntInst, PHINode *CntPhi,
274 Value *Var, Instruction *DefX,
275 const DebugLoc &DL, bool ZeroCheck,
276 bool IsCntPhiUsedOutsideLoop,
277 bool InsertSub = false);
278
279 bool recognizeShiftUntilBitTest();
280 bool recognizeShiftUntilZero();
281 bool recognizeAndInsertStrLen();
282
283 /// @}
284};
285} // end anonymous namespace
286
289 LPMUpdater &) {
291 return PreservedAnalyses::all();
292
293 const auto *DL = &L.getHeader()->getDataLayout();
294
295 // For the new PM, we also can't use OptimizationRemarkEmitter as an analysis
296 // pass. Function analyses need to be preserved across loop transformations
297 // but ORE cannot be preserved (see comment before the pass definition).
298 OptimizationRemarkEmitter ORE(L.getHeader()->getParent());
299
300 const ScalarOptions &Opts = getScalarOptions(L);
301 LoopIdiomRecognize LIR(Opts, &AR.AA, &AR.DT, &AR.LI, &AR.SE, &AR.TLI, &AR.TTI,
302 AR.MSSA, DL, ORE);
303 if (!LIR.runOnLoop(&L))
304 return PreservedAnalyses::all();
305
307 if (AR.MSSA)
308 PA.preserve<MemorySSAAnalysis>();
309 return PA;
310}
311
313 I->replaceAllUsesWith(PoisonValue::get(I->getType()));
314 I->eraseFromParent();
315}
316
317//===----------------------------------------------------------------------===//
318//
319// Implementation of LoopIdiomRecognize
320//
321//===----------------------------------------------------------------------===//
322
323bool LoopIdiomRecognize::runOnLoop(Loop *L) {
324 CurLoop = L;
325 // If the loop could not be converted to canonical form, it must have an
326 // indirectbr in it, just give up.
327 if (!L->getLoopPreheader())
328 return false;
329
330 // Disable loop idiom recognition if the function's name is a common idiom.
331 StringRef Name = L->getHeader()->getParent()->getName();
332 if (Name == "memset" || Name == "memcpy" || Name == "strlen" ||
333 Name == "wcslen")
334 return false;
335
336 // Determine if code size heuristics need to be applied.
337 ApplyCodeSizeHeuristics =
338 L->getHeader()->getParent()->hasOptSize() && Opts.use_lir_code_size_heurs;
339
340 HasMemset = TLI->has(LibFunc_memset);
341 // TODO: Unconditionally enable use of the memset pattern intrinsic (or at
342 // least, opt-in via target hook) once we are confident it will never result
343 // in worse codegen than without. For now, use it only when the target
344 // supports memset_pattern16 libcall (or unless this is overridden by
345 // command line option).
346 HasMemsetPattern = TLI->has(LibFunc_memset_pattern16);
347 HasMemcpy = TLI->has(LibFunc_memcpy);
348
349 if (HasMemset || HasMemsetPattern ||
350 Opts.loop_idiom_force_memset_pattern_intrinsic || HasMemcpy ||
353 return runOnCountableLoop();
354
355 return runOnNoncountableLoop();
356}
357
358bool LoopIdiomRecognize::runOnCountableLoop() {
359 const SCEV *BECount = SE->getBackedgeTakenCount(CurLoop);
361 "runOnCountableLoop() called on a loop without a predictable"
362 "backedge-taken count");
363
364 // If this loop executes exactly one time, then it should be peeled, not
365 // optimized by this pass.
366 if (BECount->isZero())
367 return false;
368
370 CurLoop->getUniqueExitBlocks(ExitBlocks);
371
372 LLVM_DEBUG(dbgs() << DEBUG_TYPE " Scanning: F["
373 << CurLoop->getHeader()->getParent()->getName()
374 << "] Countable Loop %" << CurLoop->getHeader()->getName()
375 << "\n");
376
377 // The following transforms hoist stores/memsets into the loop pre-header.
378 // Give up if the loop has instructions that may throw.
379 SimpleLoopSafetyInfo SafetyInfo(CurLoop);
380 if (SafetyInfo.anyBlockMayThrow())
381 return false;
382
383 bool MadeChange = false;
384
385 // Scan all the blocks in the loop that are not in subloops.
386 for (auto *BB : CurLoop->getBlocks()) {
387 // Ignore blocks in subloops.
388 if (LI->getLoopFor(BB) != CurLoop)
389 continue;
390
391 MadeChange |= runOnLoopBlock(BB, BECount, ExitBlocks);
392 }
393
394 // Attempt to optimize a CRC loop if one is detected by HashRecognize.
396 Opts.loop_idiom_crc_strategy != CRCStrategyKind::Disable)
397 if (auto Res = HashRecognize(*CurLoop, *SE).getResult())
398 MadeChange |= optimizeCRCLoop(*Res);
399
400 return MadeChange;
401}
402
403static APInt getStoreStride(const SCEVAddRecExpr *StoreEv) {
404 const SCEVConstant *ConstStride = cast<SCEVConstant>(StoreEv->getOperand(1));
405 return ConstStride->getAPInt();
406}
407
408/// getMemSetPatternValue - If a strided store of the specified value is safe to
409/// turn into a memset.patternn intrinsic, return the Constant that should
410/// be passed in. Otherwise, return null.
411///
412/// TODO this function could allow more constants than it does today (e.g.
413/// those over 16 bytes) now it has transitioned to being used for the
414/// memset.pattern intrinsic rather than directly the memset_pattern16
415/// libcall.
417 // If the value isn't a constant, we can't promote it to being in a constant
418 // array. We could theoretically do a store to an alloca or something, but
419 // that doesn't seem worthwhile.
421 if (!C || isa<ConstantExpr>(C))
422 return nullptr;
423
424 // Only handle simple values that are a power of two bytes in size.
425 uint64_t Size = DL->getTypeSizeInBits(V->getType());
426 if (Size == 0 || (Size & 7) || (Size & (Size - 1)))
427 return nullptr;
428
429 // Don't care enough about darwin/ppc to implement this.
430 if (DL->isBigEndian())
431 return nullptr;
432
433 // Convert to size in bytes.
434 Size /= 8;
435
436 // TODO: If CI is larger than 16-bytes, we can try slicing it in half to see
437 // if the top and bottom are the same (e.g. for vectors and large integers).
438 if (Size > 16)
439 return nullptr;
440
441 // For now, don't handle types that aren't int, floats, or pointers.
442 Type *CTy = C->getType();
443 if (!CTy->isIntOrPtrTy() && !CTy->isFloatingPointTy())
444 return nullptr;
445
446 return C;
447}
448
449LoopIdiomRecognize::LegalStoreKind
450LoopIdiomRecognize::isLegalStore(StoreInst *SI) {
451 // Don't touch volatile stores.
452 if (SI->isVolatile())
453 return LegalStoreKind::None;
454 // We only want simple or unordered-atomic stores.
455 if (!SI->isUnordered())
456 return LegalStoreKind::None;
457
458 // Avoid merging nontemporal stores.
459 if (SI->getMetadata(LLVMContext::MD_nontemporal))
460 return LegalStoreKind::None;
461
462 Value *StoredVal = SI->getValueOperand();
463 Value *StorePtr = SI->getPointerOperand();
464
465 if (DL->hasUnstableRepresentation(StoredVal->getType()))
466 return LegalStoreKind::None;
467
468 // Transformations could invalidate the external-state pointers
469 // memcpy - LangRef specifies that a valid memcpy must preserve external
470 // state, so no transformations are blocked by it.
471 // memset - We assume that a memset of 0 has an equivalent external state
472 // effect as a null pointer store. This is currently not explicitly
473 // specified, but is true of the one exemplar we have (CHERI
474 // capabilities). All other memset formations are not safe.
475 bool MustPreserveExternalState = DL->hasExternalState(StoredVal->getType()) &&
476 !isa<ConstantPointerNull>(StoredVal);
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 code
480 // 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 current
487 // loop, which indicates a strided store. If we have something else, it's a
488 // 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 be
498 // turned into a memset of i8 -1, assuming that all the consecutive bytes
499 // 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 supported
504 bool UnorderedAtomic = SI->isUnordered() && !SI->isSimple();
505
506 // If we're allowed to form a memset, and the stored value would be
507 // acceptable for memset, use it.
508 if (!MustPreserveExternalState && !UnorderedAtomic && HasMemset &&
509 SplatValue && !DisableLIRP::Memset &&
510 // Verify that the stored value is loop invariant. If not, we can't
511 // promote the memset.
512 CurLoop->isLoopInvariant(SplatValue)) {
513 // It looks like we can use SplatValue.
514 return LegalStoreKind::Memset;
515 }
516 if (!MustPreserveExternalState && !UnorderedAtomic &&
517 (HasMemsetPattern || Opts.loop_idiom_force_memset_pattern_intrinsic) &&
519 // Don't create memset_pattern16s with address spaces.
520 StorePtr->getType()->getPointerAddressSpace() == 0 &&
521 getMemSetPatternValue(StoredVal, DL)) {
522 // It looks like we can use PatternValue!
523 return LegalStoreKind::MemsetPattern;
524 }
525
526 // Otherwise, see if the store can be turned into a memcpy.
527 if (HasMemcpy && !DisableLIRP::Memcpy) {
528 // Check to see if the stride matches the size of the store. If so, then we
529 // know that every byte is touched in the loop.
530 unsigned StoreSize = DL->getTypeStoreSize(SI->getValueOperand()->getType());
531 APInt StrideAP = Stride->getAPInt();
532 if (StoreSize != StrideAP && StoreSize != -StrideAP)
533 return LegalStoreKind::None;
534
535 // The store must be feeding a non-volatile load.
536 LoadInst *LI = dyn_cast<LoadInst>(SI->getValueOperand());
537
538 // Only allow non-volatile loads
539 if (!LI || LI->isVolatile())
540 return LegalStoreKind::None;
541 // Only allow simple or unordered-atomic loads
542 if (!LI->isUnordered())
543 return LegalStoreKind::None;
544
545 // See if the pointer expression is an AddRec like {base,+,1} on the current
546 // loop, which indicates a strided load. If we have something else, it's a
547 // random load we can't handle.
548 const SCEV *LoadEv = SE->getSCEV(LI->getPointerOperand());
549
550 // The store and load must share the same stride.
551 if (!match(LoadEv, m_scev_AffineAddRec(m_SCEV(), m_scev_Specific(Stride),
552 m_SpecificLoop(CurLoop))))
553 return LegalStoreKind::None;
554
555 // Success. This store can be converted into a memcpy.
556 UnorderedAtomic = UnorderedAtomic || LI->isAtomic();
557 return UnorderedAtomic ? LegalStoreKind::UnorderedAtomicMemcpy
558 : LegalStoreKind::Memcpy;
559 }
560 // This store can't be transformed into a memset/memcpy.
561 return LegalStoreKind::None;
562}
563
564void LoopIdiomRecognize::collectStores(BasicBlock *BB) {
565 StoreRefsForMemset.clear();
566 StoreRefsForMemsetPattern.clear();
567 StoreRefsForMemcpy.clear();
568 for (Instruction &I : *BB) {
570 if (!SI)
571 continue;
572
573 // Make sure this is a strided store with a constant stride.
574 switch (isLegalStore(SI)) {
575 case LegalStoreKind::None:
576 // Nothing to do
577 break;
578 case LegalStoreKind::Memset: {
579 // Find the base pointer.
580 Value *Ptr = getUnderlyingObject(SI->getPointerOperand());
581 StoreRefsForMemset[Ptr].push_back(SI);
582 } break;
583 case LegalStoreKind::MemsetPattern: {
584 // Find the base pointer.
585 Value *Ptr = getUnderlyingObject(SI->getPointerOperand());
586 StoreRefsForMemsetPattern[Ptr].push_back(SI);
587 } break;
588 case LegalStoreKind::Memcpy:
589 case LegalStoreKind::UnorderedAtomicMemcpy:
590 StoreRefsForMemcpy.push_back(SI);
591 break;
592 default:
593 assert(false && "unhandled return value");
594 break;
595 }
596 }
597}
598
599/// runOnLoopBlock - Process the specified block, which lives in a counted loop
600/// with the specified backedge count. This block is known to be in the current
601/// loop and not in any subloops.
602bool LoopIdiomRecognize::runOnLoopBlock(
603 BasicBlock *BB, const SCEV *BECount,
604 SmallVectorImpl<BasicBlock *> &ExitBlocks) {
605 // We can only promote stores in this block if they are unconditionally
606 // executed in the loop. For a block to be unconditionally executed, it has
607 // to dominate all the exit blocks of the loop. Verify this now.
608 for (BasicBlock *ExitBlock : ExitBlocks)
609 if (!DT->dominates(BB, ExitBlock))
610 return false;
611
612 bool MadeChange = false;
613 // Look for store instructions, which may be optimized to memset/memcpy.
614 collectStores(BB);
615
616 // Look for a single store or sets of stores with a common base, which can be
617 // optimized into a memset (memset_pattern). The latter most commonly happens
618 // with structs and handunrolled loops.
619 for (auto &SL : StoreRefsForMemset)
620 MadeChange |= processLoopStores(SL.second, BECount, ForMemset::Yes);
621
622 for (auto &SL : StoreRefsForMemsetPattern)
623 MadeChange |= processLoopStores(SL.second, BECount, ForMemset::No);
624
625 // Optimize the store into a memcpy, if it feeds an similarly strided load.
626 for (auto &SI : StoreRefsForMemcpy)
627 MadeChange |= processLoopStoreOfLoopLoad(SI, BECount);
628
629 MadeChange |= processLoopMemIntrinsic<MemCpyInst>(
630 BB, &LoopIdiomRecognize::processLoopMemCpy, BECount);
631 MadeChange |= processLoopMemIntrinsic<MemSetInst>(
632 BB, &LoopIdiomRecognize::processLoopMemSet, BECount);
633
634 return MadeChange;
635}
636
637/// See if this store(s) can be promoted to a memset.
638bool LoopIdiomRecognize::processLoopStores(SmallVectorImpl<StoreInst *> &SL,
639 const SCEV *BECount, ForMemset For) {
640 // Try to find consecutive stores that can be transformed into memsets.
641 SetVector<StoreInst *> Heads, Tails;
643
644 // Do a quadratic search on all of the given stores and find
645 // all of the pairs of stores that follow each other.
646 SmallVector<unsigned, 16> IndexQueue;
647 for (unsigned i = 0, e = SL.size(); i < e; ++i) {
648 assert(SL[i]->isSimple() && "Expected only non-volatile stores.");
649
650 Value *FirstStoredVal = SL[i]->getValueOperand();
651 Value *FirstStorePtr = SL[i]->getPointerOperand();
652 const SCEVAddRecExpr *FirstStoreEv =
653 cast<SCEVAddRecExpr>(SE->getSCEV(FirstStorePtr));
654 APInt FirstStride = getStoreStride(FirstStoreEv);
655 unsigned FirstStoreSize = DL->getTypeStoreSize(SL[i]->getValueOperand()->getType());
656
657 // See if we can optimize just this store in isolation.
658 if (FirstStride == FirstStoreSize || -FirstStride == FirstStoreSize) {
659 Heads.insert(SL[i]);
660 continue;
661 }
662
663 Value *FirstSplatValue = nullptr;
664 Constant *FirstPatternValue = nullptr;
665
666 if (For == ForMemset::Yes) {
667 FirstSplatValue = isBytewiseValue(FirstStoredVal, *DL);
668 if (isa<UndefValue>(FirstSplatValue))
669 continue;
670 } else {
671 FirstPatternValue = getMemSetPatternValue(FirstStoredVal, DL);
672 if (isa<UndefValue>(FirstPatternValue))
673 continue;
674 }
675
676 assert((FirstSplatValue || FirstPatternValue) &&
677 "Expected either splat value or pattern value.");
678
679 IndexQueue.clear();
680 // If a store has multiple consecutive store candidates, search Stores
681 // array according to the sequence: from i+1 to e, then from i-1 to 0.
682 // This is because usually pairing with immediate succeeding or preceding
683 // candidate create the best chance to find memset opportunity.
684 unsigned j = 0;
685 for (j = i + 1; j < e; ++j)
686 IndexQueue.push_back(j);
687 for (j = i; j > 0; --j)
688 IndexQueue.push_back(j - 1);
689
690 for (auto &k : IndexQueue) {
691 assert(SL[k]->isSimple() && "Expected only non-volatile stores.");
692 Value *SecondStorePtr = SL[k]->getPointerOperand();
693 const SCEVAddRecExpr *SecondStoreEv =
694 cast<SCEVAddRecExpr>(SE->getSCEV(SecondStorePtr));
695 APInt SecondStride = getStoreStride(SecondStoreEv);
696
697 if (FirstStride != SecondStride)
698 continue;
699
700 Value *SecondStoredVal = SL[k]->getValueOperand();
701 Value *SecondSplatValue = nullptr;
702 Constant *SecondPatternValue = nullptr;
703
704 if (For == ForMemset::Yes)
705 SecondSplatValue = isBytewiseValue(SecondStoredVal, *DL);
706 else
707 SecondPatternValue = getMemSetPatternValue(SecondStoredVal, DL);
708
709 assert((SecondSplatValue || SecondPatternValue) &&
710 "Expected either splat value or pattern value.");
711
712 if (isConsecutiveAccess(SL[i], SL[k], *DL, *SE, false)) {
713 if (For == ForMemset::Yes) {
714 if (FirstSplatValue != SecondSplatValue)
715 continue;
716 } else {
717 if (FirstPatternValue != SecondPatternValue)
718 continue;
719 }
720 Tails.insert(SL[k]);
721 Heads.insert(SL[i]);
722 ConsecutiveChain[SL[i]] = SL[k];
723 break;
724 }
725 }
726 }
727
728 // We may run into multiple chains that merge into a single chain. We mark the
729 // stores that we transformed so that we don't visit the same store twice.
730 SmallPtrSet<Value *, 16> TransformedStores;
731 bool Changed = false;
732
733 // For stores that start but don't end a link in the chain:
734 for (StoreInst *I : Heads) {
735 if (Tails.count(I))
736 continue;
737
738 // We found a store instr that starts a chain. Now follow the chain and try
739 // to transform it.
740 SmallPtrSet<Instruction *, 8> AdjacentStores;
741 StoreInst *HeadStore = I;
742 unsigned StoreSize = 0;
743
744 // Collect the chain into a list.
745 while (Tails.count(I) || Heads.count(I)) {
746 if (TransformedStores.count(I))
747 break;
748 AdjacentStores.insert(I);
749
750 StoreSize += DL->getTypeStoreSize(I->getValueOperand()->getType());
751 // Move to the next value in the chain.
752 I = ConsecutiveChain[I];
753 }
754
755 Value *StoredVal = HeadStore->getValueOperand();
756 Value *StorePtr = HeadStore->getPointerOperand();
757 const SCEVAddRecExpr *StoreEv = cast<SCEVAddRecExpr>(SE->getSCEV(StorePtr));
758 APInt Stride = getStoreStride(StoreEv);
759
760 // Check to see if the stride matches the size of the stores. If so, then
761 // we know that every byte is touched in the loop.
762 if (StoreSize != Stride && StoreSize != -Stride)
763 continue;
764
765 bool IsNegStride = StoreSize == -Stride;
766
767 Type *IntIdxTy = DL->getIndexType(StorePtr->getType());
768 const SCEV *StoreSizeSCEV = SE->getConstant(IntIdxTy, StoreSize);
769 if (processLoopStridedStore(StorePtr, StoreSizeSCEV,
770 MaybeAlign(HeadStore->getAlign()), StoredVal,
771 HeadStore, AdjacentStores, StoreEv, BECount,
772 IsNegStride)) {
773 TransformedStores.insert_range(AdjacentStores);
774 Changed = true;
775 }
776 }
777
778 return Changed;
779}
780
781/// processLoopMemIntrinsic - Template function for calling different processor
782/// functions based on mem intrinsic type.
783template <typename MemInst>
784bool LoopIdiomRecognize::processLoopMemIntrinsic(
785 BasicBlock *BB,
786 bool (LoopIdiomRecognize::*Processor)(MemInst *, const SCEV *),
787 const SCEV *BECount) {
788 bool MadeChange = false;
789 for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E;) {
790 Instruction *Inst = &*I++;
791 // Look for memory instructions, which may be optimized to a larger one.
792 if (MemInst *MI = dyn_cast<MemInst>(Inst)) {
793 WeakTrackingVH InstPtr(&*I);
794 if (!(this->*Processor)(MI, BECount))
795 continue;
796 MadeChange = true;
797
798 // If processing the instruction invalidated our iterator, start over from
799 // the top of the block.
800 if (!InstPtr)
801 I = BB->begin();
802 }
803 }
804 return MadeChange;
805}
806
807/// processLoopMemCpy - See if this memcpy can be promoted to a large memcpy
808bool LoopIdiomRecognize::processLoopMemCpy(MemCpyInst *MCI,
809 const SCEV *BECount) {
810 // We can only handle non-volatile memcpys with a constant size.
811 if (MCI->isVolatile() || !isa<ConstantInt>(MCI->getLength()))
812 return false;
813
814 // If we're not allowed to hack on memcpy, we fail. We don't mess with the
815 // inlined version as generating a larger inline mempcy could affect code
816 // size.
817 if (!HasMemcpy || MCI->isForceInlined() || DisableLIRP::Memcpy)
818 return false;
819
820 Value *Dest = MCI->getDest();
821 Value *Source = MCI->getSource();
822 if (!Dest || !Source)
823 return false;
824
825 // See if the load and store pointer expressions are AddRec like {base,+,1} on
826 // the current loop, which indicates a strided load and store. If we have
827 // something else, it's a random load or store we can't handle.
828 const SCEV *StoreEv = SE->getSCEV(Dest);
829 const SCEV *LoadEv = SE->getSCEV(Source);
830 const APInt *StoreStrideValue, *LoadStrideValue;
831 if (!match(StoreEv,
832 m_scev_AffineAddRec(m_SCEV(), m_scev_APInt(StoreStrideValue),
833 m_SpecificLoop(CurLoop))) ||
834 !match(LoadEv,
835 m_scev_AffineAddRec(m_SCEV(), m_scev_APInt(LoadStrideValue),
836 m_SpecificLoop(CurLoop))))
837 return false;
838
839 // Reject memcpys that are so large that they overflow an unsigned.
840 uint64_t SizeInBytes = cast<ConstantInt>(MCI->getLength())->getZExtValue();
841 if ((SizeInBytes >> 32) != 0)
842 return false;
843
844 // Huge stride value - give up
845 if (StoreStrideValue->getBitWidth() > 64 ||
846 LoadStrideValue->getBitWidth() > 64)
847 return false;
848
849 if (SizeInBytes != *StoreStrideValue && SizeInBytes != -*StoreStrideValue) {
850 ORE.emit([&]() {
851 return OptimizationRemarkMissed(DEBUG_TYPE, "SizeStrideUnequal", MCI)
852 << ore::NV("Inst", "memcpy") << " in "
853 << ore::NV("Function", MCI->getFunction())
854 << " function will not be hoisted: "
855 << ore::NV("Reason", "memcpy size is not equal to stride");
856 });
857 return false;
858 }
859
860 int64_t StoreStrideInt = StoreStrideValue->getSExtValue();
861 int64_t LoadStrideInt = LoadStrideValue->getSExtValue();
862 // Check if the load stride matches the store stride.
863 if (StoreStrideInt != LoadStrideInt)
864 return false;
865
866 return processLoopStoreOfLoopLoad(
867 Dest, Source, SE->getConstant(Dest->getType(), SizeInBytes),
868 MCI->getDestAlign(), MCI->getSourceAlign(), MCI, MCI,
869 cast<SCEVAddRecExpr>(StoreEv), cast<SCEVAddRecExpr>(LoadEv), BECount);
870}
871
872/// processLoopMemSet - See if this memset can be promoted to a large memset.
873bool LoopIdiomRecognize::processLoopMemSet(MemSetInst *MSI,
874 const SCEV *BECount) {
875 // We can only handle non-volatile memsets.
876 if (MSI->isVolatile())
877 return false;
878
879 // If we're not allowed to hack on memset, we fail. We don't mess with the
880 // inlined version as generating a larger memset could affect code size.
881 if (!HasMemset || MSI->isForceInlined() || DisableLIRP::Memset)
882 return false;
883
884 Value *Pointer = MSI->getDest();
885
886 // See if the pointer expression is an AddRec like {base,+,1} on the current
887 // loop, which indicates a strided store. If we have something else, it's a
888 // random store we can't handle.
889 const SCEV *Ev = SE->getSCEV(Pointer);
890 const SCEV *PointerStrideSCEV;
891 if (!match(Ev, m_scev_AffineAddRec(m_SCEV(), m_SCEV(PointerStrideSCEV),
892 m_SpecificLoop(CurLoop)))) {
893 LLVM_DEBUG(dbgs() << " Pointer is not affine, abort\n");
894 return false;
895 }
896
897 SCEVUse MemsetSizeSCEV = SE->getSCEV(MSI->getLength());
898
899 bool IsNegStride = false;
900 const bool IsConstantSize = isa<ConstantInt>(MSI->getLength());
901
902 if (IsConstantSize) {
903 // Memset size is constant.
904 // Check if the pointer stride matches the memset size. If so, then
905 // we know that every byte is touched in the loop.
906 LLVM_DEBUG(dbgs() << " memset size is constant\n");
907 uint64_t SizeInBytes = cast<ConstantInt>(MSI->getLength())->getZExtValue();
908 const APInt *Stride;
909 if (!match(PointerStrideSCEV, m_scev_APInt(Stride)))
910 return false;
911
912 if (SizeInBytes != *Stride && SizeInBytes != -*Stride)
913 return false;
914
915 IsNegStride = SizeInBytes == -*Stride;
916 } else {
917 // Memset size is non-constant.
918 // Check if the pointer stride matches the memset size.
919 // To be conservative, the pass would not promote pointers that aren't in
920 // address space zero. Also, the pass only handles memset length and stride
921 // that are invariant for the top level loop.
922 LLVM_DEBUG(dbgs() << " memset size is non-constant\n");
923 if (Pointer->getType()->getPointerAddressSpace() != 0) {
924 LLVM_DEBUG(dbgs() << " pointer is not in address space zero, "
925 << "abort\n");
926 return false;
927 }
928 if (!SE->isLoopInvariant(MemsetSizeSCEV, CurLoop)) {
929 LLVM_DEBUG(dbgs() << " memset size is not a loop-invariant, "
930 << "abort\n");
931 return false;
932 }
933
934 // Compare positive direction PointerStrideSCEV with MemsetSizeSCEV
935 IsNegStride = PointerStrideSCEV->isNonConstantNegative();
936 SCEVUse PositiveStrideSCEV =
937 IsNegStride ? SCEVUse(SE->getNegativeSCEV(PointerStrideSCEV))
938 : SCEVUse(PointerStrideSCEV);
939 LLVM_DEBUG(dbgs() << " MemsetSizeSCEV: " << *MemsetSizeSCEV << "\n"
940 << " PositiveStrideSCEV: " << *PositiveStrideSCEV
941 << "\n");
942
943 if (PositiveStrideSCEV != MemsetSizeSCEV) {
944 // If an expression is covered by the loop guard, compare again and
945 // proceed with optimization if equal.
946 const SCEV *FoldedPositiveStride =
947 SE->applyLoopGuards(PositiveStrideSCEV, CurLoop);
948 const SCEV *FoldedMemsetSize =
949 SE->applyLoopGuards(MemsetSizeSCEV, CurLoop);
950
951 LLVM_DEBUG(dbgs() << " Try to fold SCEV based on loop guard\n"
952 << " FoldedMemsetSize: " << *FoldedMemsetSize << "\n"
953 << " FoldedPositiveStride: " << *FoldedPositiveStride
954 << "\n");
955
956 if (FoldedPositiveStride != FoldedMemsetSize) {
957 LLVM_DEBUG(dbgs() << " SCEV don't match, abort\n");
958 return false;
959 }
960 }
961 }
962
963 // Verify that the memset value is loop invariant. If not, we can't promote
964 // the memset.
965 Value *SplatValue = MSI->getValue();
966 if (!SplatValue || !CurLoop->isLoopInvariant(SplatValue))
967 return false;
968
970 MSIs.insert(MSI);
971 return processLoopStridedStore(Pointer, SE->getSCEV(MSI->getLength()),
972 MSI->getDestAlign(), SplatValue, MSI, MSIs,
973 cast<SCEVAddRecExpr>(Ev), BECount, IsNegStride,
974 /*IsLoopMemset=*/true);
975}
976
977/// Return true if \p I is a (simple, loop-invariant-valued) store of the same
978/// bytewise value \p SplatByte.
979static bool isSameByteValueStore(Instruction &I, Value *SplatByte, Loop *L,
980 const DataLayout &DL) {
981 assert(SplatByte && "expected a bytewise splat value to match against");
982 auto *SI = dyn_cast<StoreInst>(&I);
983 if (!SI || !SI->isSimple() || !L->isLoopInvariant(SI->getValueOperand()))
984 return false;
985 return isBytewiseValue(SI->getValueOperand(), DL) == SplatByte;
986}
987
988/// mayLoopAccessLocation - Return true if the specified loop might access the
989/// specified pointer location, which is a loop-strided access. The 'Access'
990/// argument specifies what the verboten forms of access are (read or write).
991///
992/// When the access size cannot be bounded, fall back to allow stores writing
993/// the same byte value \p SplatByte.
995 const SCEV *BECount,
996 const SCEV *StoreSizeSCEV, AliasAnalysis &AA,
997 SmallPtrSetImpl<Instruction *> &IgnoredInsts,
998 Value *SplatByte = nullptr,
999 const DataLayout *DL = nullptr) {
1000 // Get the location that may be stored across the loop. Since the access is
1001 // strided positively through memory, we say that the modified location starts
1002 // at the pointer and has infinite size.
1004
1005 // If the loop iterates a fixed number of times, we can refine the access size
1006 // to be exactly the size of the memset, which is (BECount+1)*StoreSize
1007 const APInt *BECst, *ConstSize;
1008 if (match(BECount, m_scev_APInt(BECst)) &&
1009 match(StoreSizeSCEV, m_scev_APInt(ConstSize))) {
1010 std::optional<uint64_t> BEInt = BECst->tryZExtValue();
1011 std::optional<uint64_t> SizeInt = ConstSize->tryZExtValue();
1012 // FIXME: Should this check for overflow?
1013 if (BEInt && SizeInt)
1014 AccessSize = LocationSize::precise((*BEInt + 1) * *SizeInt);
1015 }
1016
1017 // TODO: For this to be really effective, we have to dive into the pointer
1018 // operand in the store. Store to &A[i] of 100 will always return may alias
1019 // with store of &A[100], we need to StoreLoc to be "A" with size of 100,
1020 // which will then no-alias a store to &A[100].
1021 MemoryLocation StoreLoc(Ptr, AccessSize);
1022
1023 // Only consult the same-byte-value fallback when the access size stayed
1024 // infinite (non-constant trip count); with a precise size AA is accurate.
1025 bool TrySameByteValue = !AccessSize.isPrecise() && SplatByte && DL;
1026
1027 for (BasicBlock *B : L->blocks())
1028 for (Instruction &I : *B)
1029 if (!IgnoredInsts.contains(&I) &&
1030 isModOrRefSet(AA.getModRefInfo(&I, StoreLoc) & Access)) {
1031 if (TrySameByteValue && isSameByteValueStore(I, SplatByte, L, *DL))
1032 continue;
1033 return true;
1034 }
1035 return false;
1036}
1037
1038// If we have a negative stride, Start refers to the end of the memory location
1039// we're trying to memset. Therefore, we need to recompute the base pointer,
1040// which is just Start - BECount*Size.
1041static const SCEV *getStartForNegStride(const SCEV *Start, const SCEV *BECount,
1042 Type *IntPtr, const SCEV *StoreSizeSCEV,
1043 ScalarEvolution *SE) {
1044 const SCEV *Index = SE->getTruncateOrZeroExtend(BECount, IntPtr);
1045 if (!StoreSizeSCEV->isOne()) {
1046 // index = back edge count * store size
1047 Index = SE->getMulExpr(Index,
1048 SE->getTruncateOrZeroExtend(StoreSizeSCEV, IntPtr),
1050 }
1051 // base pointer = start - index * store size
1052 return SE->getMinusSCEV(Start, Index);
1053}
1054
1055/// Compute the number of bytes as a SCEV from the backedge taken count.
1056///
1057/// This also maps the SCEV into the provided type and tries to handle the
1058/// computation in a way that will fold cleanly.
1059static const SCEV *getNumBytes(const SCEV *BECount, Type *IntPtr,
1060 const SCEV *StoreSizeSCEV, Loop *CurLoop,
1061 const DataLayout *DL, ScalarEvolution *SE) {
1062 const SCEV *TripCountSCEV =
1063 SE->getTripCountFromExitCount(BECount, IntPtr, CurLoop);
1064 return SE->getMulExpr(TripCountSCEV,
1065 SE->getTruncateOrZeroExtend(StoreSizeSCEV, IntPtr),
1067}
1068
1069/// processLoopStridedStore - We see a strided store of some value. If we can
1070/// transform this into a memset or memset_pattern in the loop preheader, do so.
1071bool LoopIdiomRecognize::processLoopStridedStore(
1072 Value *DestPtr, const SCEV *StoreSizeSCEV, MaybeAlign StoreAlignment,
1073 Value *StoredVal, Instruction *TheStore,
1075 const SCEV *BECount, bool IsNegStride, bool IsLoopMemset) {
1076 // We currently don't convert inline intrinsics into larger ones, to avoid
1077 // code size increase. `processLoopMemSet` checks that the intrinsic is not
1078 // inline before calling this function.
1079 assert((isa<StoreInst>(TheStore) ||
1080 !cast<MemIntrinsic>(TheStore)->isForceInlined()) &&
1081 "inline mem intrinsics should be filtered out by callers");
1082
1083 Module *M = TheStore->getModule();
1084
1085 // The trip count of the loop and the base pointer of the addrec SCEV is
1086 // guaranteed to be loop invariant, which means that it should dominate the
1087 // header. This allows us to insert code for it in the preheader.
1088 unsigned DestAS = DestPtr->getType()->getPointerAddressSpace();
1089 BasicBlock *Preheader = CurLoop->getLoopPreheader();
1090 IRBuilder<> Builder(Preheader->getTerminator());
1091 SCEVExpander Expander(*SE, "loop-idiom");
1092 SCEVExpanderCleaner ExpCleaner(Expander);
1093
1094 Type *DestInt8PtrTy = Builder.getPtrTy(DestAS);
1095 Type *IntIdxTy = DL->getIndexType(DestPtr->getType());
1096
1097 bool Changed = false;
1098 const SCEV *Start = Ev->getStart();
1099 // Handle negative strided loops.
1100 if (IsNegStride)
1101 Start = getStartForNegStride(Start, BECount, IntIdxTy, StoreSizeSCEV, SE);
1102
1103 // TODO: ideally we should still be able to generate memset if SCEV expander
1104 // is taught to generate the dependencies at the latest point.
1105 if (!Expander.isSafeToExpand(Start))
1106 return Changed;
1107
1108 // Okay, we have a strided store "p[i]" of a splattable value. We can turn
1109 // this into a memset in the loop preheader now if we want. However, this
1110 // would be unsafe to do if there is anything else in the loop that may read
1111 // or write to the aliased location. Check for any overlap by generating the
1112 // base pointer and checking the region.
1113 Value *BasePtr =
1114 Expander.expandCodeFor(Start, DestInt8PtrTy, Preheader->getTerminator());
1115
1116 // From here on out, conservatively report to the pass manager that we've
1117 // changed the IR, even if we later clean up these added instructions. There
1118 // may be structural differences e.g. in the order of use lists not accounted
1119 // for in just a textual dump of the IR. This is written as a variable, even
1120 // though statically all the places this dominates could be replaced with
1121 // 'true', with the hope that anyone trying to be clever / "more precise" with
1122 // the return value will read this comment, and leave them alone.
1123 Changed = true;
1124
1125 Value *SplatValue = isBytewiseValue(StoredVal, *DL);
1126 if (mayLoopAccessLocation(BasePtr, ModRefInfo::ModRef, CurLoop, BECount,
1127 StoreSizeSCEV, *AA, Stores, SplatValue, DL))
1128 return Changed;
1129
1130 if (avoidLIRForMultiBlockLoop(/*IsMemset=*/true, IsLoopMemset))
1131 return Changed;
1132
1133 // Okay, everything looks good, insert the memset.
1134 Constant *PatternValue = nullptr;
1135 if (!SplatValue)
1136 PatternValue = getMemSetPatternValue(StoredVal, DL);
1137
1138 // MemsetArg is the number of bytes for the memset libcall, and the number
1139 // of pattern repetitions if the memset.pattern intrinsic is being used.
1140 Value *MemsetArg;
1141 std::optional<int64_t> BytesWritten;
1142
1143 if (PatternValue &&
1144 (HasMemsetPattern || Opts.loop_idiom_force_memset_pattern_intrinsic)) {
1145 const SCEV *TripCountS =
1146 SE->getTripCountFromExitCount(BECount, IntIdxTy, CurLoop);
1147 if (!Expander.isSafeToExpand(TripCountS))
1148 return Changed;
1149 const SCEVConstant *ConstStoreSize = dyn_cast<SCEVConstant>(StoreSizeSCEV);
1150 if (!ConstStoreSize)
1151 return Changed;
1152 Value *TripCount = Expander.expandCodeFor(TripCountS, IntIdxTy,
1153 Preheader->getTerminator());
1154 uint64_t PatternRepsPerTrip =
1155 (ConstStoreSize->getValue()->getZExtValue() * 8) /
1156 DL->getTypeSizeInBits(PatternValue->getType());
1157 // If ConstStoreSize is not equal to the width of PatternValue, then
1158 // MemsetArg is TripCount * (ConstStoreSize/PatternValueWidth). Else
1159 // MemSetArg is just TripCount.
1160 MemsetArg =
1161 PatternRepsPerTrip == 1
1162 ? TripCount
1163 : Builder.CreateMul(TripCount,
1164 Builder.getIntN(IntIdxTy->getIntegerBitWidth(),
1165 PatternRepsPerTrip));
1166 if (auto *CI = dyn_cast<ConstantInt>(TripCount))
1167 BytesWritten =
1168 CI->getZExtValue() * ConstStoreSize->getValue()->getZExtValue();
1169
1170 } else {
1171 const SCEV *NumBytesS =
1172 getNumBytes(BECount, IntIdxTy, StoreSizeSCEV, CurLoop, DL, SE);
1173
1174 // TODO: ideally we should still be able to generate memset if SCEV expander
1175 // is taught to generate the dependencies at the latest point.
1176 if (!Expander.isSafeToExpand(NumBytesS))
1177 return Changed;
1178 MemsetArg =
1179 Expander.expandCodeFor(NumBytesS, IntIdxTy, Preheader->getTerminator());
1180 if (auto *CI = dyn_cast<ConstantInt>(MemsetArg))
1181 BytesWritten = CI->getZExtValue();
1182 }
1183 assert(MemsetArg && "MemsetArg should have been set");
1184
1185 AAMDNodes AATags = TheStore->getAAMetadata();
1186 for (Instruction *Store : Stores)
1187 AATags = AATags.merge(Store->getAAMetadata());
1188 if (BytesWritten)
1189 AATags = AATags.extendTo(BytesWritten.value());
1190 else
1191 AATags = AATags.extendTo(-1);
1192
1193 CallInst *NewCall;
1194 if (SplatValue) {
1195 NewCall = Builder.CreateMemSet(BasePtr, SplatValue, MemsetArg,
1196 MaybeAlign(StoreAlignment),
1197 /*isVolatile=*/false, AATags);
1198 } else if (Opts.loop_idiom_force_memset_pattern_intrinsic ||
1199 isLibFuncEmittable(M, TLI, LibFunc_memset_pattern16)) {
1200 assert(isa<SCEVConstant>(StoreSizeSCEV) && "Expected constant store size");
1201
1202 NewCall = Builder.CreateIntrinsicWithoutFolding(
1203 Intrinsic::experimental_memset_pattern,
1204 {DestInt8PtrTy, PatternValue->getType(), IntIdxTy},
1205 {BasePtr, PatternValue, MemsetArg,
1206 ConstantInt::getFalse(M->getContext())});
1207 if (StoreAlignment)
1208 cast<MemSetPatternInst>(NewCall)->setDestAlignment(*StoreAlignment);
1209 NewCall->setAAMetadata(AATags);
1210 } else {
1211 // Neither a memset, nor memset_pattern16
1212 return Changed;
1213 }
1214
1215 NewCall->setDebugLoc(TheStore->getDebugLoc());
1216
1217 if (MSSAU) {
1218 MemoryAccess *NewMemAcc = MSSAU->createMemoryAccessInBB(
1219 NewCall, nullptr, NewCall->getParent(), MemorySSA::BeforeTerminator);
1220 MSSAU->insertDef(cast<MemoryDef>(NewMemAcc), true);
1221 }
1222
1223 LLVM_DEBUG(dbgs() << " Formed memset: " << *NewCall << "\n"
1224 << " from store to: " << *Ev << " at: " << *TheStore
1225 << "\n");
1226
1227 ORE.emit([&]() {
1228 OptimizationRemark R(DEBUG_TYPE, "ProcessLoopStridedStore",
1229 NewCall->getDebugLoc(), Preheader);
1230 R << "Transformed loop-strided store in "
1231 << ore::NV("Function", TheStore->getFunction())
1232 << " function into a call to "
1233 << ore::NV("NewFunction", NewCall->getCalledFunction())
1234 << "() intrinsic";
1235 if (!Stores.empty())
1236 R << ore::setExtraArgs();
1237 for (auto *I : Stores) {
1238 R << ore::NV("FromBlock", I->getParent()->getName())
1239 << ore::NV("ToBlock", Preheader->getName());
1240 }
1241 return R;
1242 });
1243
1244 // Okay, the memset has been formed. Zap the original store and anything that
1245 // feeds into it.
1246 for (auto *I : Stores) {
1247 if (MSSAU)
1248 MSSAU->removeMemoryAccess(I, true);
1250 }
1251 if (MSSAU && VerifyMemorySSA)
1252 MSSAU->getMemorySSA()->verifyMemorySSA();
1253 ++NumMemSet;
1254 ExpCleaner.markResultUsed();
1255 return true;
1256}
1257
1258/// If the stored value is a strided load in the same loop with the same stride
1259/// this may be transformable into a memcpy. This kicks in for stuff like
1260/// for (i) A[i] = B[i];
1261bool LoopIdiomRecognize::processLoopStoreOfLoopLoad(StoreInst *SI,
1262 const SCEV *BECount) {
1263 assert(SI->isUnordered() && "Expected only non-volatile non-ordered stores.");
1264
1265 Value *StorePtr = SI->getPointerOperand();
1266 const SCEVAddRecExpr *StoreEv = cast<SCEVAddRecExpr>(SE->getSCEV(StorePtr));
1267 unsigned StoreSize = DL->getTypeStoreSize(SI->getValueOperand()->getType());
1268
1269 // The store must be feeding a non-volatile load.
1270 LoadInst *LI = cast<LoadInst>(SI->getValueOperand());
1271 assert(LI->isUnordered() && "Expected only non-volatile non-ordered loads.");
1272
1273 // See if the pointer expression is an AddRec like {base,+,1} on the current
1274 // loop, which indicates a strided load. If we have something else, it's a
1275 // random load we can't handle.
1276 Value *LoadPtr = LI->getPointerOperand();
1277 const SCEVAddRecExpr *LoadEv = cast<SCEVAddRecExpr>(SE->getSCEV(LoadPtr));
1278
1279 const SCEV *StoreSizeSCEV = SE->getConstant(StorePtr->getType(), StoreSize);
1280 return processLoopStoreOfLoopLoad(StorePtr, LoadPtr, StoreSizeSCEV,
1281 SI->getAlign(), LI->getAlign(), SI, LI,
1282 StoreEv, LoadEv, BECount);
1283}
1284
1285namespace {
1286class MemmoveVerifier {
1287public:
1288 explicit MemmoveVerifier(const SCEV &LoadStart, const SCEV &StoreStart,
1289 ScalarEvolution &SE)
1290 : DL(SE.getDataLayout()),
1291 Off(dyn_cast<SCEVConstant>(SE.getMinusSCEV(&StoreStart, &LoadStart))),
1292 BasePtr(dyn_cast<SCEVUnknown>(SE.getPointerBase(&StoreStart))),
1293 IsSameObject(Off != nullptr) {}
1294
1295 bool loadAndStoreMayFormMemmove(unsigned StoreSize, bool IsNegStride,
1296 const Instruction &TheLoad,
1297 bool IsMemCpy) const {
1298 // The store must be at a constant offset from the load, and there must be
1299 // an underlying pointer.
1300 if (!Off || !BasePtr)
1301 return false;
1302 const APInt &OffVal = Off->getAPInt();
1303 // If null is defined then the base pointer can't be null
1304 auto *NullBase = dyn_cast<ConstantPointerNull>(BasePtr->getValue());
1305 if (NullBase && NullPointerIsDefined(
1306 TheLoad.getParent()->getParent(),
1307 NullBase->getPointerType()->getPointerAddressSpace()))
1308 return false;
1309 int64_t LoadSize;
1310 if (IsMemCpy) {
1311 // memcpy is equivalent to a sequence of byte loads and stores
1312 LoadSize = 1;
1313 } else {
1314 LoadSize = DL.getTypeSizeInBits(TheLoad.getType()).getFixedValue() / 8;
1315 if (LoadSize != StoreSize)
1316 return false;
1317 }
1318 // Ensure that LoadBasePtr is after StoreBasePtr or before StoreBasePtr
1319 // for negative stride. LoadBasePtr shouldn't overlap with StoreBasePtr.
1320 if (IsNegStride ? OffVal.slt(LoadSize) : OffVal.sgt(-LoadSize))
1321 return false;
1322 return true;
1323 }
1324
1325private:
1326 const DataLayout &DL;
1327 const SCEVConstant *Off;
1328 const SCEVUnknown *BasePtr;
1329
1330public:
1331 const bool IsSameObject;
1332};
1333} // namespace
1334
1335bool LoopIdiomRecognize::processLoopStoreOfLoopLoad(
1336 Value *DestPtr, Value *SourcePtr, const SCEV *StoreSizeSCEV,
1337 MaybeAlign StoreAlign, MaybeAlign LoadAlign, Instruction *TheStore,
1338 Instruction *TheLoad, const SCEVAddRecExpr *StoreEv,
1339 const SCEVAddRecExpr *LoadEv, const SCEV *BECount) {
1340 // We currently don't convert inline intrinsics into larger ones, to avoid
1341 // code size increase. `processLoopMemCpy` checks that the intrinsic is not
1342 // inline before calling this function.
1343 assert((isa<StoreInst>(TheStore) ||
1344 !cast<MemIntrinsic>(TheStore)->isForceInlined()) &&
1345 "inline mem intrinsics should be filtered out by callers");
1346
1347 // The trip count of the loop and the base pointer of the addrec SCEV is
1348 // guaranteed to be loop invariant, which means that it should dominate the
1349 // header. This allows us to insert code for it in the preheader.
1350 BasicBlock *Preheader = CurLoop->getLoopPreheader();
1351 IRBuilder<> Builder(Preheader->getTerminator());
1352 SCEVExpander Expander(*SE, "loop-idiom");
1353
1354 SCEVExpanderCleaner ExpCleaner(Expander);
1355
1356 bool Changed = false;
1357 const SCEV *StrStart = StoreEv->getStart();
1358 unsigned StrAS = DestPtr->getType()->getPointerAddressSpace();
1359 Type *IntIdxTy = Builder.getIntNTy(DL->getIndexSizeInBits(StrAS));
1360
1361 APInt Stride = getStoreStride(StoreEv);
1362 const SCEVConstant *ConstStoreSize = dyn_cast<SCEVConstant>(StoreSizeSCEV);
1363
1364 // TODO: Deal with non-constant size; Currently expect constant store size
1365 assert(ConstStoreSize && "store size is expected to be a constant");
1366
1367 int64_t StoreSize = ConstStoreSize->getValue()->getZExtValue();
1368 bool IsNegStride = StoreSize == -Stride;
1369
1370 // Handle negative strided loops.
1371 if (IsNegStride)
1372 StrStart =
1373 getStartForNegStride(StrStart, BECount, IntIdxTy, StoreSizeSCEV, SE);
1374
1375 // Okay, we have a strided store "p[i]" of a loaded value. We can turn
1376 // this into a memcpy in the loop preheader now if we want. However, this
1377 // would be unsafe to do if there is anything else in the loop that may read
1378 // or write the memory region we're storing to. This includes the load that
1379 // feeds the stores. Check for an alias by generating the base address and
1380 // checking everything.
1381 Value *StoreBasePtr = Expander.expandCodeFor(
1382 StrStart, Builder.getPtrTy(StrAS), Preheader->getTerminator());
1383
1384 // From here on out, conservatively report to the pass manager that we've
1385 // changed the IR, even if we later clean up these added instructions. There
1386 // may be structural differences e.g. in the order of use lists not accounted
1387 // for in just a textual dump of the IR. This is written as a variable, even
1388 // though statically all the places this dominates could be replaced with
1389 // 'true', with the hope that anyone trying to be clever / "more precise" with
1390 // the return value will read this comment, and leave them alone.
1391 Changed = true;
1392
1393 SmallPtrSet<Instruction *, 2> IgnoredInsts;
1394 IgnoredInsts.insert(TheStore);
1395
1396 bool IsMemCpy = isa<MemCpyInst>(TheStore);
1397 const StringRef InstRemark = IsMemCpy ? "memcpy" : "load and store";
1398
1399 bool LoopAccessStore =
1400 mayLoopAccessLocation(StoreBasePtr, ModRefInfo::ModRef, CurLoop, BECount,
1401 StoreSizeSCEV, *AA, IgnoredInsts);
1402 if (LoopAccessStore) {
1403 // For memmove case it's not enough to guarantee that loop doesn't access
1404 // TheStore and TheLoad. Additionally we need to make sure that TheStore is
1405 // the only user of TheLoad.
1406 if (!TheLoad->hasOneUse())
1407 return Changed;
1408 IgnoredInsts.insert(TheLoad);
1409 if (mayLoopAccessLocation(StoreBasePtr, ModRefInfo::ModRef, CurLoop,
1410 BECount, StoreSizeSCEV, *AA, IgnoredInsts)) {
1411 ORE.emit([&]() {
1412 return OptimizationRemarkMissed(DEBUG_TYPE, "LoopMayAccessStore",
1413 TheStore)
1414 << ore::NV("Inst", InstRemark) << " in "
1415 << ore::NV("Function", TheStore->getFunction())
1416 << " function will not be hoisted: "
1417 << ore::NV("Reason", "The loop may access store location");
1418 });
1419 return Changed;
1420 }
1421 IgnoredInsts.erase(TheLoad);
1422 }
1423
1424 const SCEV *LdStart = LoadEv->getStart();
1425 unsigned LdAS = SourcePtr->getType()->getPointerAddressSpace();
1426
1427 // Handle negative strided loops.
1428 if (IsNegStride)
1429 LdStart =
1430 getStartForNegStride(LdStart, BECount, IntIdxTy, StoreSizeSCEV, SE);
1431
1432 // For a memcpy, we have to make sure that the input array is not being
1433 // mutated by the loop.
1434 Value *LoadBasePtr = Expander.expandCodeFor(LdStart, Builder.getPtrTy(LdAS),
1435 Preheader->getTerminator());
1436
1437 // If the store is a memcpy instruction, we must check if it will write to
1438 // the load memory locations. So remove it from the ignored stores.
1439 MemmoveVerifier Verifier(*LdStart, *StrStart, *SE);
1440 if (IsMemCpy && !Verifier.IsSameObject)
1441 IgnoredInsts.erase(TheStore);
1442 if (mayLoopAccessLocation(LoadBasePtr, ModRefInfo::Mod, CurLoop, BECount,
1443 StoreSizeSCEV, *AA, IgnoredInsts)) {
1444 ORE.emit([&]() {
1445 return OptimizationRemarkMissed(DEBUG_TYPE, "LoopMayAccessLoad", TheLoad)
1446 << ore::NV("Inst", InstRemark) << " in "
1447 << ore::NV("Function", TheStore->getFunction())
1448 << " function will not be hoisted: "
1449 << ore::NV("Reason", "The loop may access load location");
1450 });
1451 return Changed;
1452 }
1453
1454 bool IsAtomic = TheStore->isAtomic() || TheLoad->isAtomic();
1455 bool UseMemMove = IsMemCpy ? Verifier.IsSameObject : LoopAccessStore;
1456
1457 if (IsAtomic) {
1458 // For now don't support unordered atomic memmove.
1459 if (UseMemMove)
1460 return Changed;
1461
1462 // We cannot allow unaligned ops for unordered load/store, so reject
1463 // anything where the alignment isn't at least the element size.
1464 assert((StoreAlign && LoadAlign) &&
1465 "Expect unordered load/store to have align.");
1466 if (*StoreAlign < StoreSize || *LoadAlign < StoreSize)
1467 return Changed;
1468
1469 // If the element.atomic memcpy is not lowered into explicit
1470 // loads/stores later, then it will be lowered into an element-size
1471 // specific lib call. If the lib call doesn't exist for our store size, then
1472 // we shouldn't generate the memcpy.
1473 if (StoreSize > TTI->getAtomicMemIntrinsicMaxElementSize())
1474 return Changed;
1475 }
1476
1477 if (UseMemMove)
1478 if (!Verifier.loadAndStoreMayFormMemmove(StoreSize, IsNegStride, *TheLoad,
1479 IsMemCpy))
1480 return Changed;
1481
1482 if (avoidLIRForMultiBlockLoop())
1483 return Changed;
1484
1485 // Okay, everything is safe, we can transform this!
1486
1487 const SCEV *NumBytesS =
1488 getNumBytes(BECount, IntIdxTy, StoreSizeSCEV, CurLoop, DL, SE);
1489
1490 Value *NumBytes =
1491 Expander.expandCodeFor(NumBytesS, IntIdxTy, Preheader->getTerminator());
1492
1493 AAMDNodes AATags = TheLoad->getAAMetadata();
1494 AAMDNodes StoreAATags = TheStore->getAAMetadata();
1495 AATags = AATags.merge(StoreAATags);
1496 if (auto CI = dyn_cast<ConstantInt>(NumBytes))
1497 AATags = AATags.extendTo(CI->getZExtValue());
1498 else
1499 AATags = AATags.extendTo(-1);
1500
1501 CallInst *NewCall = nullptr;
1502 // Check whether to generate an unordered atomic memcpy:
1503 // If the load or store are atomic, then they must necessarily be unordered
1504 // by previous checks.
1505 if (!IsAtomic) {
1506 if (UseMemMove)
1507 NewCall = Builder.CreateMemMove(StoreBasePtr, StoreAlign, LoadBasePtr,
1508 LoadAlign, NumBytes,
1509 /*isVolatile=*/false, AATags);
1510 else
1511 NewCall =
1512 Builder.CreateMemCpy(StoreBasePtr, StoreAlign, LoadBasePtr, LoadAlign,
1513 NumBytes, /*isVolatile=*/false, AATags);
1514 } else {
1515 // Create the call.
1516 // Note that unordered atomic loads/stores are *required* by the spec to
1517 // have an alignment but non-atomic loads/stores may not.
1518 NewCall = Builder.CreateElementUnorderedAtomicMemCpy(
1519 StoreBasePtr, *StoreAlign, LoadBasePtr, *LoadAlign, NumBytes, StoreSize,
1520 AATags);
1521 }
1522 NewCall->setDebugLoc(TheStore->getDebugLoc());
1523
1524 if (MSSAU) {
1525 MemoryAccess *NewMemAcc = MSSAU->createMemoryAccessInBB(
1526 NewCall, nullptr, NewCall->getParent(), MemorySSA::BeforeTerminator);
1527 MSSAU->insertDef(cast<MemoryDef>(NewMemAcc), true);
1528 }
1529
1530 LLVM_DEBUG(dbgs() << " Formed new call: " << *NewCall << "\n"
1531 << " from load ptr=" << *LoadEv << " at: " << *TheLoad
1532 << "\n"
1533 << " from store ptr=" << *StoreEv << " at: " << *TheStore
1534 << "\n");
1535
1536 ORE.emit([&]() {
1537 return OptimizationRemark(DEBUG_TYPE, "ProcessLoopStoreOfLoopLoad",
1538 NewCall->getDebugLoc(), Preheader)
1539 << "Formed a call to "
1540 << ore::NV("NewFunction", NewCall->getCalledFunction())
1541 << "() intrinsic from " << ore::NV("Inst", InstRemark)
1542 << " instruction in " << ore::NV("Function", TheStore->getFunction())
1543 << " function"
1545 << ore::NV("FromBlock", TheStore->getParent()->getName())
1546 << ore::NV("ToBlock", Preheader->getName());
1547 });
1548
1549 // Okay, a new call to memcpy/memmove has been formed. Zap the original store
1550 // and anything that feeds into it.
1551 if (MSSAU)
1552 MSSAU->removeMemoryAccess(TheStore, true);
1553 deleteDeadInstruction(TheStore);
1554 if (MSSAU && VerifyMemorySSA)
1555 MSSAU->getMemorySSA()->verifyMemorySSA();
1556 if (UseMemMove)
1557 ++NumMemMove;
1558 else
1559 ++NumMemCpy;
1560 ExpCleaner.markResultUsed();
1561 return true;
1562}
1563
1564// When compiling for codesize we avoid idiom recognition for a multi-block loop
1565// unless it is a loop_memset idiom or a memset/memcpy idiom in a nested loop.
1566//
1567bool LoopIdiomRecognize::avoidLIRForMultiBlockLoop(bool IsMemset,
1568 bool IsLoopMemset) {
1569 if (ApplyCodeSizeHeuristics && CurLoop->getNumBlocks() > 1) {
1570 if (CurLoop->isOutermost() && (!IsMemset || !IsLoopMemset)) {
1571 LLVM_DEBUG(dbgs() << " " << CurLoop->getHeader()->getParent()->getName()
1572 << " : LIR " << (IsMemset ? "Memset" : "Memcpy")
1573 << " avoided: multi-block top-level loop\n");
1574 return true;
1575 }
1576 }
1577
1578 return false;
1579}
1580
1581bool LoopIdiomRecognize::optimizeCRCLoop(const PolynomialInfo &Info) {
1582 // FIXME: Hexagon has a special HexagonLoopIdiom that optimizes CRC using
1583 // carry-less multiplication instructions, which is more efficient than our
1584 // Sarwate table-lookup optimization. Hence, until we're able to emit
1585 // target-specific instructions for Hexagon, subsuming HexagonLoopIdiom,
1586 // disable the optimization for Hexagon.
1587 Module &M = *CurLoop->getHeader()->getModule();
1588 Triple TT(M.getTargetTriple());
1589 if (TT.getArch() == Triple::hexagon)
1590 return false;
1591
1592 LLVMContext &Ctx = Info.LHS->getContext();
1593 Type *CRCTy = Info.LHS->getType();
1594 unsigned CRCBW = CRCTy->getIntegerBitWidth();
1595
1596 // CRC computation is mostly serial, so latency works best for comparison.
1599
1600 InstructionCost XorCost =
1601 TTI->getArithmeticInstrCost(Instruction::Xor, CRCTy, CostKind);
1602 InstructionCost ShiftCost =
1603 TTI->getArithmeticInstrCost(Instruction::LShr, CRCTy, CostKind);
1604 InstructionCost AndCost =
1605 TTI->getArithmeticInstrCost(Instruction::And, CRCTy, CostKind);
1606 InstructionCost SelectCost =
1607 TTI->getCmpSelInstrCost(Instruction::Select, CRCTy, Type::getInt1Ty(Ctx),
1608 CmpInst::BAD_ICMP_PREDICATE, CostKind);
1609 InstructionCost LoadCost =
1610 TTI->getMemoryOpCost(Instruction::Load, CRCTy, DL->getABITypeAlign(CRCTy),
1611 DL->getDefaultGlobalsAddressSpace(), CostKind);
1612 auto ClmulCost = [&](unsigned BW) {
1613 auto *Ty = IntegerType::get(Ctx, BW);
1614 IntrinsicCostAttributes Attrs(Intrinsic::clmul, Ty, {Ty, Ty});
1615 return TTI->getIntrinsicInstrCost(Attrs, CostKind);
1616 };
1617
1618 // Estimate the cost of the original, unoptimized loop.
1619 InstructionCost OrigLoopCost =
1620 (2 * ShiftCost + 2 * XorCost + AndCost + SelectCost) * Info.TripCount;
1621
1622 // Estimate the cost of the Sarwate lookup table optimization strategy.
1623 // As mentioned previously, a byte-multiple trip count is required.
1624 InstructionCost TableStrategyCost =
1625 Info.TripCount % 8 != 0
1627 : (LoadCost + XorCost + 2 * ShiftCost) * (Info.TripCount / 8);
1628
1629 // Estimate the cost of the carry-less multiplication optimization strategy.
1630 InstructionCost ClmulStrategyCost = ClmulCost(2 * Info.TripCount) +
1631 ClmulCost(CRCBW + Info.TripCount) +
1632 2 * XorCost + 2 * ShiftCost + AndCost;
1633
1634 ORE.emit([&]() {
1635 return OptimizationRemarkAnalysis(DEBUG_TYPE, "CRCLoopCosts",
1636 CurLoop->getStartLoc(),
1637 CurLoop->getHeader())
1638 << "CRC loop costs: original="
1639 << ore::NV("OrigLoopCost", OrigLoopCost)
1640 << ", table=" << ore::NV("TableStrategyCost", TableStrategyCost)
1641 << ", clmul=" << ore::NV("ClmulStrategyCost", ClmulStrategyCost);
1642 });
1643
1644 auto ReportMissed = [&](StringRef Reason) {
1645 ORE.emit([&]() {
1646 return OptimizationRemarkMissed(DEBUG_TYPE, "CRCLoopMissed",
1647 CurLoop->getStartLoc(),
1648 CurLoop->getHeader())
1649 << "CRC loop not optimized: " << Reason;
1650 });
1651 };
1652 auto ReportOptimized = [&](StringRef Strategy, StringRef Reason) {
1653 ORE.emit([&]() {
1654 return OptimizationRemark(DEBUG_TYPE, "CRCLoopOptimized",
1655 CurLoop->getStartLoc(), CurLoop->getHeader())
1656 << "CRC loop optimized using " << ore::NV("Strategy", Strategy)
1657 << ": " << Reason;
1658 });
1659 };
1660
1661 switch (Opts.loop_idiom_crc_strategy) {
1662 default:
1663 ReportMissed("disabled by user");
1664 return false;
1666 // The table strategy is not possible in its current form without a byte-
1667 // multiple trip count.
1668 if (Info.TripCount % 8 == 0) {
1669 optimizeCRCLoopUsingTableLookup(Info);
1670 ReportOptimized("table", "forced by user");
1671 return true;
1672 }
1673 ReportMissed("table strategy forced, but not possible");
1674 return false;
1676 optimizeCRCLoopUsingClmul(Info);
1677 ReportOptimized("clmul", "forced by user");
1678 return true;
1680 // When using the auto strategy, bail if we are optimizing for size since
1681 // there's usually not a clear size benefit.
1682 // TODO: The clmul optimization is around the same size in many cases, so it
1683 // could be worth it to take advantage of that fact, especially if it would
1684 // be much faster than the original loop.
1685 if (ApplyCodeSizeHeuristics) {
1686 ReportMissed("optimizing for size");
1687 return false;
1688 }
1689
1690 // Only apply an optimization if there's a clear benefit to doing so.
1691 if (std::min(TableStrategyCost, ClmulStrategyCost) >= OrigLoopCost) {
1692 ReportMissed("no profitable strategy");
1693 return false;
1694 }
1695
1696 if (TableStrategyCost <= ClmulStrategyCost) {
1697 optimizeCRCLoopUsingTableLookup(Info);
1698 ReportOptimized("table", "most profitable strategy");
1699 } else {
1700 optimizeCRCLoopUsingClmul(Info);
1701 ReportOptimized("clmul", "most profitable strategy");
1702 }
1703 return true;
1704 }
1705}
1706
1707// The algorithm used in this optimization is a Polynomial (GF(2)) Barrett
1708// Reduction based on Intel's "Fast CRC Computation for Generic Polynomials
1709// Using PCLMULQDQ Instruction" white paper (December 2009).
1710void LoopIdiomRecognize::optimizeCRCLoopUsingClmul(const PolynomialInfo &Info) {
1711 // TODO: If clmul exists on the target but not for the required width, it
1712 // might be possible to split into multiple iterations of reduction.
1713 Type *CRCTy = Info.LHS->getType();
1714 LLVMContext &Ctx = CRCTy->getContext();
1715 unsigned CRCBW = CRCTy->getIntegerBitWidth();
1716 // The loop's TripCount determines how many bits of the data are processed,
1717 // regardless of whether the actual data bit width matches (if auxiliary data
1718 // is even used at all).
1719 unsigned TC = Info.TripCount;
1720 // Based on the clmul inputs, the first clmul needs 2*TC bits, and the second
1721 // needs CRCBW+TC bits. However, only the low TC bits of the first clmul are
1722 // used in little-endian, so a clmul in TC bits suffices in that case.
1723 IntegerType *ClmulMuTy =
1724 IntegerType::get(Ctx, Info.IsBigEndian ? 2 * TC : TC);
1725 IntegerType *ClmulGPTy = IntegerType::get(Ctx, CRCBW + TC);
1726
1727 // First, generate the constants required for GF(2) Barrett reduction.
1728 auto [Mu, FullGenPoly] = HashRecognize::genBarrettConstants(Info);
1729 Value *MuConst =
1730 ConstantInt::get(Ctx, Mu.zextOrTrunc(ClmulMuTy->getBitWidth()));
1731 Value *GenPolyConst =
1732 ConstantInt::get(Ctx, FullGenPoly.zext(ClmulGPTy->getBitWidth()));
1733
1734 IRBuilder<> Builder(CurLoop->getLoopPreheader()->getTerminator());
1735
1736 // If a shift needs to occur in the setup for the first clmul with MuConst, it
1737 // will be by abs(TC - CRCBW). To ensure that the shift can work without
1738 // losing information or creating poison, give it CRCBW + TC bits.
1739 bool SetupShiftNeeded = Info.IsBigEndian && TC != CRCBW;
1740 auto *SetupTy = IntegerType::get(Ctx, SetupShiftNeeded ? CRCBW + TC : TC);
1741
1742 // Based on the Intel white paper, in our case, we have
1743 // R(x) = (LHS*x^TC) xor (LHSAux ? getTCBits(LHSAux)*x^CRCBW : 0)
1744 // since the CRC loop multiplies LHS by x each iteration, and the x^CRCBW term
1745 // of getTCBits(LHSAux) is XORed in for the significant bit check.
1746 // Rather than compute the full R(x), we can split it in two: a quotient for
1747 // step 1 (floor(R(x)/x^CRCBW)) and a remainder for step 3 (R(x) mod x^CRCBW).
1748 //
1749 // ClmulMuInput is an evolving variable that will eventually become the part
1750 // used in step 1, which can be simplified to
1751 // (LHS*x^(TC-CRCBW)) xor (LHSAux ? getTCBits(LHSAux) : 0).
1752 // Thanks to restrictions imposed by HashRecognize for big-endian CRC loops,
1753 // getTCBits(LHSAux) = LHSAux*x^(TC-CRCBW), so this can be further simplified
1754 // to (LHS xor (LHSAux ? LHSAux : 0))*x^(TC-CRCBW).
1755 Value *ClmulMuInput =
1756 Builder.CreateZExtOrTrunc(Info.LHS, SetupTy, "crc.cast");
1757
1758 // If auxiliary data is present, XOR it in with the CRC.
1759 if (Value *Data = Info.LHSAux) {
1760 // This is usually a zext, but DataBW may exceed CRCBW+TC if both CRCBW and
1761 // TC are small enough.
1762 Data = Builder.CreateZExtOrTrunc(Data, SetupTy, "data.cast");
1763
1764 ClmulMuInput = Builder.CreateXor(ClmulMuInput, Data, "xor.crc.data");
1765 }
1766
1767 // Align the current CRC with TripCount (multiply or divide by x^(TC-CRCBW)).
1768 if (SetupShiftNeeded) {
1769 ClmulMuInput =
1770 TC > CRCBW
1771 ? Builder.CreateShl(ClmulMuInput, TC - CRCBW, "crc.align.tc")
1772 : Builder.CreateLShr(ClmulMuInput, CRCBW - TC, "crc.align.tc");
1773 }
1774
1775 // Zero out any bits above (TC-1) for calculation since the original loop
1776 // doesn't use them in the significant bit checks.
1777 if (SetupTy->getBitWidth() > TC) {
1778 auto *Mask =
1779 ConstantInt::get(Ctx, APInt::getLowBitsSet(SetupTy->getBitWidth(), TC));
1780 ClmulMuInput = Builder.CreateAnd(ClmulMuInput, Mask, "crc.tcbits");
1781 }
1782
1783 // Step 1: T1(x) = floor(R(x)/x^CRCBW) * mu
1784 // Input is TC bits and mu is TC+1 bits, so result will be 2*TC bits.
1785 ClmulMuInput =
1786 Builder.CreateZExtOrTrunc(ClmulMuInput, ClmulMuTy, "tcbits.cast");
1787 Value *ClmulMu = Builder.CreateBinaryIntrinsic(
1788 Intrinsic::clmul, ClmulMuInput, MuConst, /*FMFSource=*/{}, "clmul.mu");
1789
1790 // Calculate floor(T1(x)/x^TC) for step 2.
1791 Value *ClmulGPInput =
1792 Info.IsBigEndian ? Builder.CreateLShr(ClmulMu, TC, "quot.lshr") : ClmulMu;
1793
1794 // Step 2: T2(x) = floor(T1(x)/x^TC) * P(x)
1795 // Input is TC bits and P(x) is CRCBW+1 bits, so result will be CRCBW+TC bits.
1796 ClmulGPInput =
1797 Builder.CreateZExtOrTrunc(ClmulGPInput, ClmulGPTy, "quot.cast");
1798 Value *ClmulGP = Builder.CreateBinaryIntrinsic(Intrinsic::clmul, ClmulGPInput,
1799 GenPolyConst,
1800 /*FMFSource=*/{}, "clmul.gp");
1801
1802 // Calculate the least significant part of R(x) for step 3 as specified above.
1803 // R(x) mod x^CRCBW = LHS*x^TC mod x^CRCBW, though the (mod x^CRCBW) is
1804 // handled later on when truncating back to CRCBW for ComputedValue.
1805 Value *CRCNext = Builder.CreateZExt(Info.LHS, ClmulGPTy, "crc.recast");
1806 if (Info.IsBigEndian)
1807 CRCNext = Builder.CreateShl(CRCNext, TC, "crc.shl");
1808
1809 // Step 3: C(x) = (R(x) xor T2(x)) mod x^CRCBW
1810 CRCNext = Builder.CreateXor(CRCNext, ClmulGP, "xor.crc.mult");
1811 if (!Info.IsBigEndian)
1812 CRCNext = Builder.CreateLShr(CRCNext, TC, "crc.lshr");
1813
1814 // Bring the result back down the the CRC bit width.
1815 CRCNext = Builder.CreateTrunc(CRCNext, CRCTy, "crc.next");
1816
1817 // Replace the result of the loop with the new computed CRC value.
1818 Info.ComputedValue->replaceUsesOutsideBlock(CRCNext, CurLoop->getLoopLatch());
1819
1820 // Finally, clean up the loop as much as possible so it can be trivially
1821 // deleted.
1822 {
1823 for (PHINode &PN : make_early_inc_range(CurLoop->getHeader()->phis())) {
1824 PN.replaceAllUsesWith(PoisonValue::get(PN.getType()));
1826 }
1827 // Replace the exit condition with constant true/false to always cause a
1828 // branch to the exit block.
1830 auto *BrInst = cast<CondBrInst>(CurLoop->getLoopLatch()->getTerminator());
1831 BrInst->setCondition(ConstantInt::getBool(
1832 Ctx, BrInst->getSuccessor(0) == CurLoop->getExitBlock()));
1833 SE->forgetLoop(CurLoop);
1834 }
1835}
1836
1837void LoopIdiomRecognize::optimizeCRCLoopUsingTableLookup(
1838 const PolynomialInfo &Info) {
1839 assert(Info.TripCount % 8 == 0 && "A byte-multiple trip count is required");
1840
1841 // First, create a new GlobalVariable corresponding to the
1842 // Sarwate-lookup-table.
1843 Type *CRCTy = Info.LHS->getType();
1844 unsigned CRCBW = CRCTy->getIntegerBitWidth();
1845 std::array<Constant *, 256> CRCConstants;
1847 CRCConstants.begin(),
1848 [CRCTy](const APInt &E) { return ConstantInt::get(CRCTy, E); });
1849 Constant *ConstArray =
1850 ConstantArray::get(ArrayType::get(CRCTy, 256), CRCConstants);
1852 *CurLoop->getHeader()->getModule(), ConstArray->getType(), true,
1853 GlobalValue::PrivateLinkage, ConstArray, ".crctable");
1854
1857
1858 // Next, mark all PHIs for removal except IV.
1859 {
1860 for (PHINode &PN : CurLoop->getHeader()->phis()) {
1861 if (&PN == IV)
1862 continue;
1863 PN.replaceAllUsesWith(PoisonValue::get(PN.getType()));
1864 Cleanup.push_back(&PN);
1865 }
1866 }
1867
1868 // Next, fix up the trip count.
1869 {
1870 unsigned NewBTC = (Info.TripCount / 8) - 1;
1871 BasicBlock *LoopBlk = CurLoop->getLoopLatch();
1872 CondBrInst *BrInst = cast<CondBrInst>(LoopBlk->getTerminator());
1873 CmpPredicate ExitPred = BrInst->getSuccessor(0) == LoopBlk
1876 Instruction *ExitCond = CurLoop->getLatchCmpInst();
1877 Value *ExitLimit = ConstantInt::get(IV->getType(), NewBTC);
1878 IRBuilder<> Builder(ExitCond);
1879 Value *NewExitCond =
1880 Builder.CreateICmp(ExitPred, IV, ExitLimit, "exit.cond");
1881 ExitCond->replaceAllUsesWith(NewExitCond);
1882 deleteDeadInstruction(ExitCond);
1883 }
1884
1885 // Finally, fill the loop with the Sarwate-table-lookup logic, and replace all
1886 // uses of ComputedValue.
1887 //
1888 // Little-endian:
1889 // crc = (crc >> 8) ^ tbl[(iv'th byte of data) ^ (bottom byte of crc)]
1890 // Big-Endian:
1891 // crc = (crc << 8) ^ tbl[(iv'th byte of data) ^ (top byte of crc)]
1892 {
1893 auto LoByte = [](IRBuilderBase &Builder, Value *Op, const Twine &Name) {
1894 return Builder.CreateZExtOrTrunc(
1895 Op, IntegerType::getInt8Ty(Op->getContext()), Name);
1896 };
1897 auto HiIdx = [LoByte, CRCBW](IRBuilderBase &Builder, Value *Op,
1898 const Twine &Name) {
1899 // Shift the top bits of Op to the bottom byte by using the CRC bitwidth
1900 // as a reference.
1901 if (CRCBW != 8) {
1902 Op = CRCBW > 8 ? Builder.CreateLShr(Op, CRCBW - 8, Name)
1903 : Builder.CreateShl(Op, 8 - CRCBW, Name);
1904 }
1905 return LoByte(Builder, Op, Name + ".lo.byte");
1906 };
1907
1908 IRBuilder<> Builder(CurLoop->getHeader()->getFirstNonPHIIt());
1909
1910 // Create the CRC PHI, and initialize its incoming value to the initial
1911 // value of CRC.
1912 PHINode *CRCPhi = Builder.CreatePHI(CRCTy, 2, "crc");
1913 CRCPhi->addIncoming(Info.LHS, CurLoop->getLoopPreheader());
1914
1915 // CRC is now an evolving variable, initialized to the PHI.
1916 Value *CRC = CRCPhi;
1917
1918 // TableIndexer = ((top|bottom) byte of CRC). It is XOR'ed with (iv'th byte
1919 // of LHSAux), if LHSAux is non-nullptr.
1920 Value *Indexer = CRC;
1921 if (Value *Data = Info.LHSAux) {
1922 Type *DataTy = Data->getType();
1923
1924 // To index into the (iv'th byte of LHSAux), we multiply iv by 8, and we
1925 // shift right by that amount, and take the lo-byte (in the little-endian
1926 // case), or shift left by that amount, and take the hi-idx (in the
1927 // big-endian case).
1928 Value *IVBits = Builder.CreateZExtOrTrunc(
1929 Builder.CreateShl(IV, 3, "iv.bits"), DataTy, "iv.indexer");
1930 Value *DataIndexer =
1931 Info.IsBigEndian ? Builder.CreateShl(Data, IVBits, "data.indexer")
1932 : Builder.CreateLShr(Data, IVBits, "data.indexer");
1933 Indexer = Builder.CreateXor(
1934 DataIndexer,
1935 Builder.CreateZExtOrTrunc(Indexer, DataTy, "crc.indexer.cast"),
1936 "crc.data.indexer");
1937 }
1938
1939 Indexer = Info.IsBigEndian ? HiIdx(Builder, Indexer, "indexer.hi")
1940 : LoByte(Builder, Indexer, "indexer.lo");
1941
1942 // Always index into a GEP using the index type.
1943 Indexer = Builder.CreateZExt(
1944 Indexer, SE->getDataLayout().getIndexType(GV->getType()),
1945 "indexer.ext");
1946
1947 // CRCTableLd = CRCTable[(iv'th byte of data) ^ (top|bottom) byte of CRC].
1948 Value *CRCTableGEP =
1949 Builder.CreateInBoundsGEP(CRCTy, GV, Indexer, "tbl.ptradd");
1950 Instruction *CRCTableLd = Builder.CreateLoad(CRCTy, CRCTableGEP, "tbl.ld");
1951
1952 // Update MemorySSA since we just created a new load instruction.
1953 if (MSSAU) {
1954 auto *NewMemAcc = MSSAU->createMemoryAccessInBB(
1955 CRCTableLd, /*Definition=*/nullptr, CRCTableLd->getParent(),
1957 MSSAU->insertUse(cast<MemoryUse>(NewMemAcc), /*RenameUses=*/true);
1958 }
1959
1960 // CRCNext = (CRC (<<|>>) 8) ^ CRCTableLd, or simply CRCTableLd in case of
1961 // CRC-8.
1962 Value *CRCNext = CRCTableLd;
1963 if (CRCBW > 8) {
1964 Value *CRCShift = Info.IsBigEndian
1965 ? Builder.CreateShl(CRC, 8, "crc.be.shift")
1966 : Builder.CreateLShr(CRC, 8, "crc.le.shift");
1967 CRCNext = Builder.CreateXor(CRCShift, CRCTableLd, "crc.next");
1968 }
1969
1970 // Connect the back-edge for the loop, and RAUW the ComputedValue.
1971 CRCPhi->addIncoming(CRCNext, CurLoop->getLoopLatch());
1972 Info.ComputedValue->replaceUsesOutsideBlock(CRCNext,
1973 CurLoop->getLoopLatch());
1974 }
1975
1976 // Cleanup.
1977 {
1978 for (PHINode *PN : Cleanup)
1980 SE->forgetLoop(CurLoop);
1981 if (MSSAU && VerifyMemorySSA)
1982 MSSAU->getMemorySSA()->verifyMemorySSA();
1983 }
1984}
1985
1986bool LoopIdiomRecognize::runOnNoncountableLoop() {
1987 LLVM_DEBUG(dbgs() << DEBUG_TYPE " Scanning: F["
1988 << CurLoop->getHeader()->getParent()->getName()
1989 << "] Noncountable Loop %"
1990 << CurLoop->getHeader()->getName() << "\n");
1991
1992 return recognizePopcount() || recognizeAndInsertFFS() ||
1993 recognizeShiftUntilBitTest() || recognizeShiftUntilZero() ||
1994 recognizeShiftUntilLessThan() || recognizeAndInsertStrLen();
1995}
1996
1997/// Check if the given conditional branch is based on the comparison between
1998/// a variable and zero, and if the variable is non-zero or zero (JmpOnZero is
1999/// true), the control yields to the loop entry. If the branch matches the
2000/// behavior, the variable involved in the comparison is returned. This function
2001/// will be called to see if the precondition and postcondition of the loop are
2002/// in desirable form.
2004 bool JmpOnZero = false) {
2006 if (!Cond)
2007 return nullptr;
2008
2009 auto *CmpZero = dyn_cast<ConstantInt>(Cond->getOperand(1));
2010 if (!CmpZero || !CmpZero->isZero())
2011 return nullptr;
2012
2013 BasicBlock *TrueSucc = BI->getSuccessor(0);
2014 BasicBlock *FalseSucc = BI->getSuccessor(1);
2015 if (JmpOnZero)
2016 std::swap(TrueSucc, FalseSucc);
2017
2018 ICmpInst::Predicate Pred = Cond->getPredicate();
2019 if ((Pred == ICmpInst::ICMP_NE && TrueSucc == LoopEntry) ||
2020 (Pred == ICmpInst::ICMP_EQ && FalseSucc == LoopEntry))
2021 return Cond->getOperand(0);
2022
2023 return nullptr;
2024}
2025
2026namespace {
2027
2028class StrlenVerifier {
2029public:
2030 explicit StrlenVerifier(const Loop *CurLoop, ScalarEvolution *SE,
2031 const TargetLibraryInfo *TLI)
2032 : CurLoop(CurLoop), SE(SE), TLI(TLI) {}
2033
2034 bool isValidStrlenIdiom() {
2035 // Give up if the loop has multiple blocks, multiple backedges, or
2036 // multiple exit blocks
2037 if (CurLoop->getNumBackEdges() != 1 || CurLoop->getNumBlocks() != 1 ||
2038 !CurLoop->getUniqueExitBlock())
2039 return false;
2040
2041 // It should have a preheader and a branch instruction.
2042 BasicBlock *Preheader = CurLoop->getLoopPreheader();
2043 if (!Preheader ||
2045 return false;
2046
2047 // The loop exit must be conditioned on an icmp with 0 the null terminator.
2048 // The icmp operand has to be a load on some SSA reg that increments
2049 // by 1 in the loop.
2050 BasicBlock *LoopBody = *CurLoop->block_begin();
2051
2052 // Skip if the body is too big as it most likely is not a strlen idiom.
2053 if (!LoopBody || LoopBody->size() >= 15)
2054 return false;
2055
2056 CondBrInst *LoopTerm = dyn_cast<CondBrInst>(LoopBody->getTerminator());
2057 if (!LoopTerm)
2058 return false;
2059 Value *LoopCond = matchCondition(LoopTerm, LoopBody);
2060 if (!LoopCond)
2061 return false;
2062
2063 LoadInst *LoopLoad = dyn_cast<LoadInst>(LoopCond);
2064 if (!LoopLoad || LoopLoad->getPointerAddressSpace() != 0)
2065 return false;
2066
2067 OperandType = LoopLoad->getType();
2068 if (!OperandType || !OperandType->isIntegerTy())
2069 return false;
2070
2071 // See if the pointer expression is an AddRec with constant step a of form
2072 // ({n,+,a}) where a is the width of the char type.
2073 Value *IncPtr = LoopLoad->getPointerOperand();
2074 const SCEV *LoadEv = SE->getSCEV(IncPtr);
2075 const APInt *Step;
2076 if (!match(LoadEv,
2077 m_scev_AffineAddRec(m_SCEV(LoadBaseEv), m_scev_APInt(Step))))
2078 return false;
2079
2080 LLVM_DEBUG(dbgs() << "pointer load scev: " << *LoadEv << "\n");
2081
2082 uint64_t StepSize = Step->getZExtValue();
2083
2084 // Verify that StepSize is consistent with platform char width.
2085 OpWidth = OperandType->getIntegerBitWidth();
2086 unsigned WcharSize = TLI->getWCharSize(*LoopLoad->getModule());
2087 if (OpWidth != 8 && OpWidth != 16 && OpWidth != 32)
2088 return false;
2089 if (StepSize != OpWidth / 8)
2090 return false;
2091 if (OpWidth >= 16) {
2092 if (OpWidth != WcharSize * 8)
2093 return false;
2094
2095 // Don't call `wcslen` if the base pointer isn't known to be aligned.
2096 const DataLayout &DL = LoopLoad->getDataLayout();
2097 Align OperandAlign = DL.getABITypeAlign(OperandType);
2098 if (LoopLoad->getAlign() < OperandAlign) {
2099 // For null pointers the load base number of trailing zeros may be
2100 // larger than what `Align` allows. So take log2 of operand alignment
2101 // instead and compare trailing zeros instead of alignments.
2102 if (SE->getMinTrailingZeros(LoadBaseEv) < Log2(OperandAlign))
2103 return false;
2104 }
2105 }
2106
2107 // Scan every instruction in the loop to ensure there are no side effects.
2108 for (Instruction &I : *LoopBody)
2109 if (I.mayHaveSideEffects())
2110 return false;
2111
2112 BasicBlock *LoopExitBB = CurLoop->getExitBlock();
2113 if (!LoopExitBB)
2114 return false;
2115
2116 for (PHINode &PN : LoopExitBB->phis()) {
2117 if (!SE->isSCEVable(PN.getType()))
2118 return false;
2119
2120 const SCEV *Ev = SE->getSCEV(&PN);
2121 if (!Ev)
2122 return false;
2123
2124 LLVM_DEBUG(dbgs() << "loop exit phi scev: " << *Ev << "\n");
2125
2126 // Since we verified that the loop trip count will be a valid strlen
2127 // idiom, we can expand all lcssa phi with {n,+,1} as (n + strlen) and use
2128 // SCEVExpander materialize the loop output.
2129 const SCEVAddRecExpr *AddRecEv = dyn_cast<SCEVAddRecExpr>(Ev);
2130 if (!AddRecEv || !AddRecEv->isAffine())
2131 return false;
2132
2133 // We only want RecAddExpr with recurrence step that is constant. This
2134 // is good enough for all the idioms we want to recognize. Later we expand
2135 // and materialize the recurrence as {base,+,a} -> (base + a * strlen)
2136 if (!isa<SCEVConstant>(AddRecEv->getStepRecurrence(*SE)))
2137 return false;
2138 }
2139
2140 return true;
2141 }
2142
2143public:
2144 const Loop *CurLoop;
2145 ScalarEvolution *SE;
2146 const TargetLibraryInfo *TLI;
2147
2148 unsigned OpWidth;
2149 ConstantInt *StepSizeCI;
2150 const SCEV *LoadBaseEv;
2152};
2153
2154} // namespace
2155
2156/// The Strlen Idiom we are trying to detect has the following structure
2157///
2158/// preheader:
2159/// ...
2160/// br label %body, ...
2161///
2162/// body:
2163/// ... ; %0 is incremented by a gep
2164/// %1 = load i8, ptr %0, align 1
2165/// %2 = icmp eq i8 %1, 0
2166/// br i1 %2, label %exit, label %body
2167///
2168/// exit:
2169/// %lcssa = phi [%0, %body], ...
2170///
2171/// We expect the strlen idiom to have a load of a character type that
2172/// is compared against '\0', and such load pointer operand must have scev
2173/// expression of the form {%str,+,c} where c is a ConstantInt of the
2174/// appropiate character width for the idiom, and %str is the base of the string
2175/// And, that all lcssa phis have the form {...,+,n} where n is a constant,
2176///
2177/// When transforming the output of the strlen idiom, the lccsa phi are
2178/// expanded using SCEVExpander as {base scev,+,a} -> (base scev + a * strlen)
2179/// and all subsequent uses are replaced. For example,
2180///
2181/// \code{.c}
2182/// const char* base = str;
2183/// while (*str != '\0')
2184/// ++str;
2185/// size_t result = str - base;
2186/// \endcode
2187///
2188/// will be transformed as follows: The idiom will be replaced by a strlen
2189/// computation to compute the address of the null terminator of the string.
2190///
2191/// \code{.c}
2192/// const char* base = str;
2193/// const char* end = base + strlen(str);
2194/// size_t result = end - base;
2195/// \endcode
2196///
2197/// In the case we index by an induction variable, as long as the induction
2198/// variable has a constant int increment, we can replace all such indvars
2199/// with the closed form computation of strlen
2200///
2201/// \code{.c}
2202/// size_t i = 0;
2203/// while (str[i] != '\0')
2204/// ++i;
2205/// size_t result = i;
2206/// \endcode
2207///
2208/// Will be replaced by
2209///
2210/// \code{.c}
2211/// size_t i = 0 + strlen(str);
2212/// size_t result = i;
2213/// \endcode
2214///
2215bool LoopIdiomRecognize::recognizeAndInsertStrLen() {
2216 if (DisableLIRP::All)
2217 return false;
2218
2219 StrlenVerifier Verifier(CurLoop, SE, TLI);
2220
2221 if (!Verifier.isValidStrlenIdiom())
2222 return false;
2223
2224 BasicBlock *Preheader = CurLoop->getLoopPreheader();
2225 BasicBlock *LoopBody = *CurLoop->block_begin();
2226 BasicBlock *LoopExitBB = CurLoop->getExitBlock();
2227 CondBrInst *LoopTerm = cast<CondBrInst>(LoopBody->getTerminator());
2228 assert(Preheader && LoopBody && LoopExitBB &&
2229 "Should be verified to be valid by StrlenVerifier");
2230
2231 if (Verifier.OpWidth == 8) {
2233 return false;
2234 if (!isLibFuncEmittable(Preheader->getModule(), TLI, LibFunc_strlen))
2235 return false;
2236 } else {
2238 return false;
2239 if (!isLibFuncEmittable(Preheader->getModule(), TLI, LibFunc_wcslen))
2240 return false;
2241 }
2242
2243 IRBuilder<> Builder(Preheader->getTerminator());
2244 Builder.SetCurrentDebugLocation(CurLoop->getStartLoc());
2245 SCEVExpander Expander(*SE, "strlen_idiom");
2246 Value *MaterialzedBase = Expander.expandCodeFor(
2247 Verifier.LoadBaseEv, Verifier.LoadBaseEv->getType(),
2248 Builder.GetInsertPoint());
2249
2250 Value *StrLenFunc = nullptr;
2251 if (Verifier.OpWidth == 8) {
2252 StrLenFunc = emitStrLen(MaterialzedBase, Builder, *DL, TLI);
2253 } else {
2254 StrLenFunc = emitWcsLen(MaterialzedBase, Builder, *DL, TLI);
2255 }
2256 assert(StrLenFunc && "Failed to emit strlen function.");
2257
2258 const SCEV *StrlenEv = SE->getSCEV(StrLenFunc);
2260 for (PHINode &PN : LoopExitBB->phis()) {
2261 // We can now materialize the loop output as all phi have scev {base,+,a}.
2262 // We expand the phi as:
2263 // %strlen = call i64 @strlen(%str)
2264 // %phi.new = base expression + step * %strlen
2265 const SCEV *Ev = SE->getSCEV(&PN);
2266 const SCEVAddRecExpr *AddRecEv = dyn_cast<SCEVAddRecExpr>(Ev);
2267 const SCEVConstant *Step =
2269 const SCEV *Base = AddRecEv->getStart();
2270
2271 // It is safe to truncate to base since if base is narrower than size_t
2272 // the equivalent user code will have to truncate anyways.
2273 const SCEV *NewEv = SE->getAddExpr(
2275 StrlenEv, Base->getType())));
2276
2277 Value *MaterializedPHI = Expander.expandCodeFor(NewEv, NewEv->getType(),
2278 Builder.GetInsertPoint());
2279 Expander.clear();
2280 PN.replaceAllUsesWith(MaterializedPHI);
2281 Cleanup.push_back(&PN);
2282 }
2283
2284 // All LCSSA Loop Phi are dead, the left over dead loop body can be cleaned
2285 // up by later passes
2286 for (PHINode *PN : Cleanup)
2288
2289 // LoopDeletion only delete invariant loops with known trip-count. We can
2290 // update the condition so it will reliablely delete the invariant loop
2291 assert((LoopTerm->getSuccessor(0) == LoopBody ||
2292 LoopTerm->getSuccessor(1) == LoopBody) &&
2293 "loop body must have a successor that is it self");
2294 ConstantInt *NewLoopCond = LoopTerm->getSuccessor(0) == LoopBody
2295 ? Builder.getFalse()
2296 : Builder.getTrue();
2297 LoopTerm->setCondition(NewLoopCond);
2298 SE->forgetLoop(CurLoop);
2299
2300 ++NumStrLen;
2301 LLVM_DEBUG(dbgs() << " Formed strlen idiom: " << *StrLenFunc << "\n");
2302 ORE.emit([&]() {
2303 return OptimizationRemark(DEBUG_TYPE, "recognizeAndInsertStrLen",
2304 CurLoop->getStartLoc(), Preheader)
2305 << "Transformed " << StrLenFunc->getName() << " loop idiom";
2306 });
2307
2308 return true;
2309}
2310
2311/// Check if the given conditional branch is based on an unsigned less-than
2312/// comparison between a variable and a constant, and if the comparison is false
2313/// the control yields to the loop entry. If the branch matches the behaviour,
2314/// the variable involved in the comparison is returned.
2316 APInt &Threshold) {
2318 if (!Cond)
2319 return nullptr;
2320
2321 ConstantInt *CmpConst = dyn_cast<ConstantInt>(Cond->getOperand(1));
2322 if (!CmpConst)
2323 return nullptr;
2324
2325 BasicBlock *FalseSucc = BI->getSuccessor(1);
2326 ICmpInst::Predicate Pred = Cond->getPredicate();
2327
2328 if (Pred == ICmpInst::ICMP_ULT && FalseSucc == LoopEntry) {
2329 Threshold = CmpConst->getValue();
2330 return Cond->getOperand(0);
2331 }
2332
2333 return nullptr;
2334}
2335
2336// Check if the recurrence variable `VarX` is in the right form to create
2337// the idiom. Returns the value coerced to a PHINode if so.
2339 BasicBlock *LoopEntry) {
2340 auto *PhiX = dyn_cast<PHINode>(VarX);
2341 if (PhiX && PhiX->getParent() == LoopEntry &&
2342 (PhiX->getOperand(0) == DefX || PhiX->getOperand(1) == DefX))
2343 return PhiX;
2344 return nullptr;
2345}
2346
2347/// Return true if the idiom is detected in the loop.
2348///
2349/// Additionally:
2350/// 1) \p CntInst is set to the instruction Counting Leading Zeros (CTLZ)
2351/// or nullptr if there is no such.
2352/// 2) \p CntPhi is set to the corresponding phi node
2353/// or nullptr if there is no such.
2354/// 3) \p InitX is set to the value whose CTLZ could be used.
2355/// 4) \p DefX is set to the instruction calculating Loop exit condition.
2356/// 5) \p Threshold is set to the constant involved in the unsigned less-than
2357/// comparison.
2358///
2359/// The core idiom we are trying to detect is:
2360/// \code
2361/// if (x0 < 2)
2362/// goto loop-exit // the precondition of the loop
2363/// cnt0 = init-val
2364/// do {
2365/// x = phi (x0, x.next); //PhiX
2366/// cnt = phi (cnt0, cnt.next)
2367///
2368/// cnt.next = cnt + 1;
2369/// ...
2370/// x.next = x >> 1; // DefX
2371/// } while (x >= 4)
2372/// loop-exit:
2373/// \endcode
2375 Intrinsic::ID &IntrinID,
2376 Value *&InitX, Instruction *&CntInst,
2377 PHINode *&CntPhi, Instruction *&DefX,
2378 APInt &Threshold) {
2379 BasicBlock *LoopEntry;
2380
2381 DefX = nullptr;
2382 CntInst = nullptr;
2383 CntPhi = nullptr;
2384 LoopEntry = *(CurLoop->block_begin());
2385
2386 // step 1: Check if the loop-back branch is in desirable form.
2387 auto *EntryBI = dyn_cast<CondBrInst>(LoopEntry->getTerminator());
2388 if (!EntryBI)
2389 return false;
2390 if (Value *T = matchShiftULTCondition(EntryBI, LoopEntry, Threshold))
2391 DefX = dyn_cast<Instruction>(T);
2392 else
2393 return false;
2394
2395 // step 2: Check the recurrence of variable X
2396 if (!DefX || !isa<PHINode>(DefX))
2397 return false;
2398
2399 PHINode *VarPhi = cast<PHINode>(DefX);
2400 int Idx = VarPhi->getBasicBlockIndex(LoopEntry);
2401 if (Idx == -1)
2402 return false;
2403
2404 DefX = dyn_cast<Instruction>(VarPhi->getIncomingValue(Idx));
2405 if (!DefX || DefX->getNumOperands() == 0 || DefX->getOperand(0) != VarPhi)
2406 return false;
2407
2408 // step 3: detect instructions corresponding to "x.next = x >> 1"
2409 if (DefX->getOpcode() != Instruction::LShr)
2410 return false;
2411
2412 IntrinID = Intrinsic::ctlz;
2414 if (!Shft || !Shft->isOne())
2415 return false;
2416
2417 InitX = VarPhi->getIncomingValueForBlock(CurLoop->getLoopPreheader());
2418
2419 // step 4: Find the instruction which count the CTLZ: cnt.next = cnt + 1
2420 // or cnt.next = cnt + -1.
2421 // TODO: We can skip the step. If loop trip count is known (CTLZ),
2422 // then all uses of "cnt.next" could be optimized to the trip count
2423 // plus "cnt0". Currently it is not optimized.
2424 // This step could be used to detect POPCNT instruction:
2425 // cnt.next = cnt + (x.next & 1)
2426 for (Instruction &Inst :
2427 llvm::make_range(LoopEntry->getFirstNonPHIIt(), LoopEntry->end())) {
2428 if (Inst.getOpcode() != Instruction::Add)
2429 continue;
2430
2432 if (!Inc || (!Inc->isOne() && !Inc->isMinusOne()))
2433 continue;
2434
2435 PHINode *Phi = getRecurrenceVar(Inst.getOperand(0), &Inst, LoopEntry);
2436 if (!Phi)
2437 continue;
2438
2439 CntInst = &Inst;
2440 CntPhi = Phi;
2441 break;
2442 }
2443 if (!CntInst)
2444 return false;
2445
2446 return true;
2447}
2448
2449/// Return true iff the idiom is detected in the loop.
2450///
2451/// Additionally:
2452/// 1) \p CntInst is set to the instruction counting the population bit.
2453/// 2) \p CntPhi is set to the corresponding phi node.
2454/// 3) \p Var is set to the value whose population bits are being counted.
2455///
2456/// The core idiom we are trying to detect is:
2457/// \code
2458/// if (x0 != 0)
2459/// goto loop-exit // the precondition of the loop
2460/// cnt0 = init-val;
2461/// do {
2462/// x1 = phi (x0, x2);
2463/// cnt1 = phi(cnt0, cnt2);
2464///
2465/// cnt2 = cnt1 + 1;
2466/// ...
2467/// x2 = x1 & (x1 - 1);
2468/// ...
2469/// } while(x != 0);
2470///
2471/// loop-exit:
2472/// \endcode
2473static bool detectPopcountIdiom(Loop *CurLoop, BasicBlock *PreCondBB,
2474 Instruction *&CntInst, PHINode *&CntPhi,
2475 Value *&Var) {
2476 // step 1: Check to see if the look-back branch match this pattern:
2477 // "if (a!=0) goto loop-entry".
2478 BasicBlock *LoopEntry;
2479 Instruction *DefX2, *CountInst;
2480 Value *VarX1, *VarX0;
2481 PHINode *PhiX, *CountPhi;
2482
2483 DefX2 = CountInst = nullptr;
2484 VarX1 = VarX0 = nullptr;
2485 PhiX = CountPhi = nullptr;
2486 LoopEntry = *(CurLoop->block_begin());
2487
2488 // step 1: Check if the loop-back branch is in desirable form.
2489 {
2490 auto *LoopTerm = dyn_cast<CondBrInst>(LoopEntry->getTerminator());
2491 if (!LoopTerm)
2492 return false;
2493 DefX2 = dyn_cast_or_null<Instruction>(matchCondition(LoopTerm, LoopEntry));
2494 }
2495
2496 // step 2: detect instructions corresponding to "x2 = x1 & (x1 - 1)"
2497 {
2498 if (!DefX2 || DefX2->getOpcode() != Instruction::And)
2499 return false;
2500
2501 BinaryOperator *SubOneOp;
2502
2503 if ((SubOneOp = dyn_cast<BinaryOperator>(DefX2->getOperand(0))))
2504 VarX1 = DefX2->getOperand(1);
2505 else {
2506 VarX1 = DefX2->getOperand(0);
2507 SubOneOp = dyn_cast<BinaryOperator>(DefX2->getOperand(1));
2508 }
2509 if (!SubOneOp || SubOneOp->getOperand(0) != VarX1)
2510 return false;
2511
2512 ConstantInt *Dec = dyn_cast<ConstantInt>(SubOneOp->getOperand(1));
2513 if (!Dec ||
2514 !((SubOneOp->getOpcode() == Instruction::Sub && Dec->isOne()) ||
2515 (SubOneOp->getOpcode() == Instruction::Add &&
2516 Dec->isMinusOne()))) {
2517 return false;
2518 }
2519 }
2520
2521 // step 3: Check the recurrence of variable X
2522 PhiX = getRecurrenceVar(VarX1, DefX2, LoopEntry);
2523 if (!PhiX)
2524 return false;
2525
2526 // step 4: Find the instruction which count the population: cnt2 = cnt1 + 1
2527 {
2528 CountInst = nullptr;
2529 for (Instruction &Inst :
2530 llvm::make_range(LoopEntry->getFirstNonPHIIt(), LoopEntry->end())) {
2531 if (Inst.getOpcode() != Instruction::Add)
2532 continue;
2533
2535 if (!Inc || !Inc->isOne())
2536 continue;
2537
2538 PHINode *Phi = getRecurrenceVar(Inst.getOperand(0), &Inst, LoopEntry);
2539 if (!Phi)
2540 continue;
2541
2542 // Check if the result of the instruction is live of the loop.
2543 bool LiveOutLoop = false;
2544 for (User *U : Inst.users()) {
2545 if ((cast<Instruction>(U))->getParent() != LoopEntry) {
2546 LiveOutLoop = true;
2547 break;
2548 }
2549 }
2550
2551 if (LiveOutLoop) {
2552 CountInst = &Inst;
2553 CountPhi = Phi;
2554 break;
2555 }
2556 }
2557
2558 if (!CountInst)
2559 return false;
2560 }
2561
2562 // step 5: check if the precondition is in this form:
2563 // "if (x != 0) goto loop-head ; else goto somewhere-we-don't-care;"
2564 {
2565 auto *PreCondBr = dyn_cast<CondBrInst>(PreCondBB->getTerminator());
2566 if (!PreCondBr)
2567 return false;
2568 Value *T = matchCondition(PreCondBr, CurLoop->getLoopPreheader());
2569 if (T != PhiX->getOperand(0) && T != PhiX->getOperand(1))
2570 return false;
2571
2572 CntInst = CountInst;
2573 CntPhi = CountPhi;
2574 Var = T;
2575 }
2576
2577 return true;
2578}
2579
2580/// Return true if the idiom is detected in the loop.
2581///
2582/// Additionally:
2583/// 1) \p CntInst is set to the instruction Counting Leading Zeros (CTLZ)
2584/// or nullptr if there is no such.
2585/// 2) \p CntPhi is set to the corresponding phi node
2586/// or nullptr if there is no such.
2587/// 3) \p Var is set to the value whose CTLZ could be used.
2588/// 4) \p DefX is set to the instruction calculating Loop exit condition.
2589///
2590/// The core idiom we are trying to detect is:
2591/// \code
2592/// if (x0 == 0)
2593/// goto loop-exit // the precondition of the loop
2594/// cnt0 = init-val;
2595/// do {
2596/// x = phi (x0, x.next); //PhiX
2597/// cnt = phi(cnt0, cnt.next);
2598///
2599/// cnt.next = cnt + 1;
2600/// ...
2601/// x.next = x >> 1; // DefX
2602/// ...
2603/// } while(x.next != 0);
2604///
2605/// loop-exit:
2606/// \endcode
2607static bool detectShiftUntilZeroIdiom(Loop *CurLoop, const DataLayout &DL,
2608 Intrinsic::ID &IntrinID, Value *&InitX,
2609 Instruction *&CntInst, PHINode *&CntPhi,
2610 Instruction *&DefX) {
2611 BasicBlock *LoopEntry;
2612 Value *VarX = nullptr;
2613
2614 DefX = nullptr;
2615 CntInst = nullptr;
2616 CntPhi = nullptr;
2617 LoopEntry = *(CurLoop->block_begin());
2618
2619 // step 1: Check if the loop-back branch is in desirable form.
2620 auto *LoopTerm = dyn_cast<CondBrInst>(LoopEntry->getTerminator());
2621 if (!LoopTerm)
2622 return false;
2623 DefX = dyn_cast_or_null<Instruction>(matchCondition(LoopTerm, LoopEntry));
2624
2625 // step 2: detect instructions corresponding to "x.next = x >> 1 or x << 1"
2626 if (!DefX || !DefX->isShift())
2627 return false;
2628 IntrinID = DefX->getOpcode() == Instruction::Shl ? Intrinsic::cttz :
2629 Intrinsic::ctlz;
2631 if (!Shft || !Shft->isOne())
2632 return false;
2633 VarX = DefX->getOperand(0);
2634
2635 // step 3: Check the recurrence of variable X
2636 PHINode *PhiX = getRecurrenceVar(VarX, DefX, LoopEntry);
2637 if (!PhiX)
2638 return false;
2639
2640 InitX = PhiX->getIncomingValueForBlock(CurLoop->getLoopPreheader());
2641
2642 // Make sure the initial value can't be negative otherwise the ashr in the
2643 // loop might never reach zero which would make the loop infinite.
2644 if (DefX->getOpcode() == Instruction::AShr && !isKnownNonNegative(InitX, DL))
2645 return false;
2646
2647 // step 4: Find the instruction which count the CTLZ: cnt.next = cnt + 1
2648 // or cnt.next = cnt + -1.
2649 // TODO: We can skip the step. If loop trip count is known (CTLZ),
2650 // then all uses of "cnt.next" could be optimized to the trip count
2651 // plus "cnt0". Currently it is not optimized.
2652 // This step could be used to detect POPCNT instruction:
2653 // cnt.next = cnt + (x.next & 1)
2654 for (Instruction &Inst :
2655 llvm::make_range(LoopEntry->getFirstNonPHIIt(), LoopEntry->end())) {
2656 if (Inst.getOpcode() != Instruction::Add)
2657 continue;
2658
2660 if (!Inc || (!Inc->isOne() && !Inc->isMinusOne()))
2661 continue;
2662
2663 PHINode *Phi = getRecurrenceVar(Inst.getOperand(0), &Inst, LoopEntry);
2664 if (!Phi)
2665 continue;
2666
2667 CntInst = &Inst;
2668 CntPhi = Phi;
2669 break;
2670 }
2671 if (!CntInst)
2672 return false;
2673
2674 return true;
2675}
2676
2677// Check if CTLZ / CTTZ intrinsic is profitable. Assume it is always
2678// profitable if we delete the loop.
2679bool LoopIdiomRecognize::isProfitableToInsertFFS(Intrinsic::ID IntrinID,
2680 Value *InitX, bool ZeroCheck,
2681 size_t CanonicalSize) {
2682 const Value *Args[] = {InitX,
2683 ConstantInt::getBool(InitX->getContext(), ZeroCheck)};
2684
2685 uint32_t HeaderSize = CurLoop->getHeader()->size();
2686
2687 IntrinsicCostAttributes Attrs(IntrinID, InitX->getType(), Args);
2688 InstructionCost Cost = TTI->getIntrinsicInstrCost(
2690 if (HeaderSize != CanonicalSize && Cost > TargetTransformInfo::TCC_Basic)
2691 return false;
2692
2693 return true;
2694}
2695
2696/// Convert CTLZ / CTTZ idiom loop into countable loop.
2697/// If CTLZ / CTTZ inserted as a new trip count returns true; otherwise,
2698/// returns false.
2699bool LoopIdiomRecognize::insertFFSIfProfitable(Intrinsic::ID IntrinID,
2700 Value *InitX, Instruction *DefX,
2701 PHINode *CntPhi,
2702 Instruction *CntInst) {
2703 bool IsCntPhiUsedOutsideLoop = false;
2704 for (User *U : CntPhi->users())
2705 if (!CurLoop->contains(cast<Instruction>(U))) {
2706 IsCntPhiUsedOutsideLoop = true;
2707 break;
2708 }
2709 bool IsCntInstUsedOutsideLoop = false;
2710 for (User *U : CntInst->users())
2711 if (!CurLoop->contains(cast<Instruction>(U))) {
2712 IsCntInstUsedOutsideLoop = true;
2713 break;
2714 }
2715 // If both CntInst and CntPhi are used outside the loop the profitability
2716 // is questionable.
2717 if (IsCntInstUsedOutsideLoop && IsCntPhiUsedOutsideLoop)
2718 return false;
2719
2720 // For some CPUs result of CTLZ(X) intrinsic is undefined
2721 // when X is 0. If we can not guarantee X != 0, we need to check this
2722 // when expand.
2723 bool ZeroCheck = false;
2724 // It is safe to assume Preheader exist as it was checked in
2725 // parent function RunOnLoop.
2726 BasicBlock *PH = CurLoop->getLoopPreheader();
2727
2728 // If we are using the count instruction outside the loop, make sure we
2729 // have a zero check as a precondition. Without the check the loop would run
2730 // one iteration for before any check of the input value. This means 0 and 1
2731 // would have identical behavior in the original loop and thus
2732 if (!IsCntPhiUsedOutsideLoop) {
2733 auto *PreCondBB = PH->getSinglePredecessor();
2734 auto *PreCondBI =
2735 PreCondBB ? dyn_cast<CondBrInst>(PreCondBB->getTerminator()) : nullptr;
2736 if (!(PreCondBI && matchCondition(PreCondBI, PH) == InitX) &&
2738 InitX, SimplifyQuery(*DL, DT, /*AC=*/nullptr, PH->getTerminator())))
2739 return false;
2740 ZeroCheck = true;
2741 }
2742
2743 // FFS idiom loop has only 6 instructions:
2744 // %n.addr.0 = phi [ %n, %entry ], [ %shr, %while.cond ]
2745 // %i.0 = phi [ %i0, %entry ], [ %inc, %while.cond ]
2746 // %shr = ashr %n.addr.0, 1
2747 // %tobool = icmp eq %shr, 0
2748 // %inc = add nsw %i.0, 1
2749 // br i1 %tobool
2750 size_t IdiomCanonicalSize = 6;
2751 if (!isProfitableToInsertFFS(IntrinID, InitX, ZeroCheck, IdiomCanonicalSize))
2752 return false;
2753
2754 transformLoopToCountable(IntrinID, PH, CntInst, CntPhi, InitX, DefX,
2755 DefX->getDebugLoc(), ZeroCheck,
2756 IsCntPhiUsedOutsideLoop);
2757 return true;
2758}
2759
2760/// Recognize CTLZ or CTTZ idiom in a non-countable loop and convert the loop
2761/// to countable (with CTLZ / CTTZ trip count). If CTLZ / CTTZ inserted as a new
2762/// trip count returns true; otherwise, returns false.
2763bool LoopIdiomRecognize::recognizeAndInsertFFS() {
2764 // Give up if the loop has multiple blocks or multiple backedges.
2765 if (CurLoop->getNumBackEdges() != 1 || CurLoop->getNumBlocks() != 1)
2766 return false;
2767
2768 Intrinsic::ID IntrinID;
2769 Value *InitX;
2770 Instruction *DefX = nullptr;
2771 PHINode *CntPhi = nullptr;
2772 Instruction *CntInst = nullptr;
2773
2774 if (!detectShiftUntilZeroIdiom(CurLoop, *DL, IntrinID, InitX, CntInst, CntPhi,
2775 DefX))
2776 return false;
2777
2778 return insertFFSIfProfitable(IntrinID, InitX, DefX, CntPhi, CntInst);
2779}
2780
2781bool LoopIdiomRecognize::recognizeShiftUntilLessThan() {
2782 // Give up if the loop has multiple blocks or multiple backedges.
2783 if (CurLoop->getNumBackEdges() != 1 || CurLoop->getNumBlocks() != 1)
2784 return false;
2785
2786 Intrinsic::ID IntrinID;
2787 Value *InitX;
2788 Instruction *DefX = nullptr;
2789 PHINode *CntPhi = nullptr;
2790 Instruction *CntInst = nullptr;
2791
2792 APInt LoopThreshold;
2793 if (!detectShiftUntilLessThanIdiom(CurLoop, *DL, IntrinID, InitX, CntInst,
2794 CntPhi, DefX, LoopThreshold))
2795 return false;
2796
2797 if (LoopThreshold == 2) {
2798 // Treat as regular FFS.
2799 return insertFFSIfProfitable(IntrinID, InitX, DefX, CntPhi, CntInst);
2800 }
2801
2802 // Look for Floor Log2 Idiom.
2803 if (LoopThreshold != 4)
2804 return false;
2805
2806 // Abort if CntPhi is used outside of the loop.
2807 for (User *U : CntPhi->users())
2808 if (!CurLoop->contains(cast<Instruction>(U)))
2809 return false;
2810
2811 // It is safe to assume Preheader exist as it was checked in
2812 // parent function RunOnLoop.
2813 BasicBlock *PH = CurLoop->getLoopPreheader();
2814 auto *PreCondBB = PH->getSinglePredecessor();
2815 if (!PreCondBB)
2816 return false;
2817 auto *PreCondBI = dyn_cast<CondBrInst>(PreCondBB->getTerminator());
2818 if (!PreCondBI)
2819 return false;
2820
2821 APInt PreLoopThreshold;
2822 if (matchShiftULTCondition(PreCondBI, PH, PreLoopThreshold) != InitX ||
2823 PreLoopThreshold != 2)
2824 return false;
2825
2826 bool ZeroCheck = true;
2827
2828 // the loop has only 6 instructions:
2829 // %n.addr.0 = phi [ %n, %entry ], [ %shr, %while.cond ]
2830 // %i.0 = phi [ %i0, %entry ], [ %inc, %while.cond ]
2831 // %shr = ashr %n.addr.0, 1
2832 // %tobool = icmp ult %n.addr.0, C
2833 // %inc = add nsw %i.0, 1
2834 // br i1 %tobool
2835 size_t IdiomCanonicalSize = 6;
2836 if (!isProfitableToInsertFFS(IntrinID, InitX, ZeroCheck, IdiomCanonicalSize))
2837 return false;
2838
2839 // log2(x) = w − 1 − clz(x)
2840 transformLoopToCountable(IntrinID, PH, CntInst, CntPhi, InitX, DefX,
2841 DefX->getDebugLoc(), ZeroCheck,
2842 /*IsCntPhiUsedOutsideLoop=*/false,
2843 /*InsertSub=*/true);
2844 return true;
2845}
2846
2847/// Recognizes a population count idiom in a non-countable loop.
2848///
2849/// If detected, transforms the relevant code to issue the popcount intrinsic
2850/// function call, and returns true; otherwise, returns false.
2851bool LoopIdiomRecognize::recognizePopcount() {
2852 if (TTI->getPopcntSupport(32) != TargetTransformInfo::PSK_FastHardware)
2853 return false;
2854
2855 // Counting population are usually conducted by few arithmetic instructions.
2856 // Such instructions can be easily "absorbed" by vacant slots in a
2857 // non-compact loop. Therefore, recognizing popcount idiom only makes sense
2858 // in a compact loop.
2859
2860 // Give up if the loop has multiple blocks or multiple backedges.
2861 if (CurLoop->getNumBackEdges() != 1 || CurLoop->getNumBlocks() != 1)
2862 return false;
2863
2864 BasicBlock *LoopBody = *(CurLoop->block_begin());
2865 if (LoopBody->size() >= 20) {
2866 // The loop is too big, bail out.
2867 return false;
2868 }
2869
2870 // It should have a preheader containing nothing but an unconditional branch.
2871 BasicBlock *PH = CurLoop->getLoopPreheader();
2872 if (!PH || &PH->front() != PH->getTerminator())
2873 return false;
2874 auto *EntryBI = dyn_cast<UncondBrInst>(PH->getTerminator());
2875 if (!EntryBI)
2876 return false;
2877
2878 // It should have a precondition block where the generated popcount intrinsic
2879 // function can be inserted.
2880 auto *PreCondBB = PH->getSinglePredecessor();
2881 if (!PreCondBB)
2882 return false;
2883 auto *PreCondBI = dyn_cast<CondBrInst>(PreCondBB->getTerminator());
2884 if (!PreCondBI)
2885 return false;
2886
2887 Instruction *CntInst;
2888 PHINode *CntPhi;
2889 Value *Val;
2890 if (!detectPopcountIdiom(CurLoop, PreCondBB, CntInst, CntPhi, Val))
2891 return false;
2892
2893 transformLoopToPopcount(PreCondBB, CntInst, CntPhi, Val);
2894 return true;
2895}
2896
2898 const DebugLoc &DL) {
2899 Value *Ops[] = {Val};
2900 Type *Tys[] = {Val->getType()};
2901
2903 return IRBuilder.CreateIntrinsic(Intrinsic::ctpop, Tys, Ops);
2904}
2905
2907 const DebugLoc &DL, bool ZeroCheck,
2908 Intrinsic::ID IID) {
2909 Value *Ops[] = {Val, IRBuilder.getInt1(ZeroCheck)};
2910 Type *Tys[] = {Val->getType()};
2911
2913 return IRBuilder.CreateIntrinsic(IID, Tys, Ops);
2914}
2915
2916/// Transform the following loop (Using CTLZ, CTTZ is similar):
2917/// loop:
2918/// CntPhi = PHI [Cnt0, CntInst]
2919/// PhiX = PHI [InitX, DefX]
2920/// CntInst = CntPhi + 1
2921/// DefX = PhiX >> 1
2922/// LOOP_BODY
2923/// Br: loop if (DefX != 0)
2924/// Use(CntPhi) or Use(CntInst)
2925///
2926/// Into:
2927/// If CntPhi used outside the loop:
2928/// CountPrev = BitWidth(InitX) - CTLZ(InitX >> 1)
2929/// Count = CountPrev + 1
2930/// else
2931/// Count = BitWidth(InitX) - CTLZ(InitX)
2932/// loop:
2933/// CntPhi = PHI [Cnt0, CntInst]
2934/// PhiX = PHI [InitX, DefX]
2935/// PhiCount = PHI [Count, Dec]
2936/// CntInst = CntPhi + 1
2937/// DefX = PhiX >> 1
2938/// Dec = PhiCount - 1
2939/// LOOP_BODY
2940/// Br: loop if (Dec != 0)
2941/// Use(CountPrev + Cnt0) // Use(CntPhi)
2942/// or
2943/// Use(Count + Cnt0) // Use(CntInst)
2944///
2945/// If LOOP_BODY is empty the loop will be deleted.
2946/// If CntInst and DefX are not used in LOOP_BODY they will be removed.
2947void LoopIdiomRecognize::transformLoopToCountable(
2948 Intrinsic::ID IntrinID, BasicBlock *Preheader, Instruction *CntInst,
2949 PHINode *CntPhi, Value *InitX, Instruction *DefX, const DebugLoc &DL,
2950 bool ZeroCheck, bool IsCntPhiUsedOutsideLoop, bool InsertSub) {
2951 // Step 1: Insert the CTLZ/CTTZ instruction at the end of the preheader block
2952 IRBuilder<> Builder(Preheader->getTerminator());
2953 Builder.SetCurrentDebugLocation(DL);
2954
2955 // If there are no uses of CntPhi crate:
2956 // Count = BitWidth - CTLZ(InitX);
2957 // NewCount = Count;
2958 // If there are uses of CntPhi create:
2959 // NewCount = BitWidth - CTLZ(InitX >> 1);
2960 // Count = NewCount + 1;
2961 Value *InitXNext;
2962 if (IsCntPhiUsedOutsideLoop) {
2963 if (DefX->getOpcode() == Instruction::AShr)
2964 InitXNext = Builder.CreateAShr(InitX, 1);
2965 else if (DefX->getOpcode() == Instruction::LShr)
2966 InitXNext = Builder.CreateLShr(InitX, 1);
2967 else if (DefX->getOpcode() == Instruction::Shl) // cttz
2968 InitXNext = Builder.CreateShl(InitX, 1);
2969 else
2970 llvm_unreachable("Unexpected opcode!");
2971 } else
2972 InitXNext = InitX;
2973 Value *Count =
2974 createFFSIntrinsic(Builder, InitXNext, DL, ZeroCheck, IntrinID);
2975 Type *CountTy = Count->getType();
2976 Count = Builder.CreateSub(
2977 ConstantInt::get(CountTy, CountTy->getIntegerBitWidth()), Count);
2978 if (InsertSub)
2979 Count = Builder.CreateSub(Count, ConstantInt::get(CountTy, 1));
2980 Value *NewCount = Count;
2981 if (IsCntPhiUsedOutsideLoop)
2982 Count = Builder.CreateAdd(Count, ConstantInt::get(CountTy, 1));
2983
2984 NewCount = Builder.CreateZExtOrTrunc(NewCount, CntInst->getType());
2985
2986 Value *CntInitVal = CntPhi->getIncomingValueForBlock(Preheader);
2987 if (cast<ConstantInt>(CntInst->getOperand(1))->isOne()) {
2988 // If the counter was being incremented in the loop, add NewCount to the
2989 // counter's initial value, but only if the initial value is not zero.
2990 ConstantInt *InitConst = dyn_cast<ConstantInt>(CntInitVal);
2991 if (!InitConst || !InitConst->isZero())
2992 NewCount = Builder.CreateAdd(NewCount, CntInitVal);
2993 } else {
2994 // If the count was being decremented in the loop, subtract NewCount from
2995 // the counter's initial value.
2996 NewCount = Builder.CreateSub(CntInitVal, NewCount);
2997 }
2998
2999 // Step 2: Insert new IV and loop condition:
3000 // loop:
3001 // ...
3002 // PhiCount = PHI [Count, Dec]
3003 // ...
3004 // Dec = PhiCount - 1
3005 // ...
3006 // Br: loop if (Dec != 0)
3007 BasicBlock *Body = *(CurLoop->block_begin());
3008 auto *LbBr = cast<CondBrInst>(Body->getTerminator());
3009 ICmpInst *LbCond = cast<ICmpInst>(LbBr->getCondition());
3010
3011 PHINode *TcPhi = PHINode::Create(CountTy, 2, "tcphi");
3012 TcPhi->insertBefore(Body->begin());
3013
3014 Builder.SetInsertPoint(LbCond);
3015 Instruction *TcDec = cast<Instruction>(Builder.CreateSub(
3016 TcPhi, ConstantInt::get(CountTy, 1), "tcdec", false, true));
3017
3018 TcPhi->addIncoming(Count, Preheader);
3019 TcPhi->addIncoming(TcDec, Body);
3020
3021 CmpInst::Predicate Pred =
3022 (LbBr->getSuccessor(0) == Body) ? CmpInst::ICMP_NE : CmpInst::ICMP_EQ;
3023 LbCond->setPredicate(Pred);
3024 LbCond->setOperand(0, TcDec);
3025 LbCond->setOperand(1, ConstantInt::get(CountTy, 0));
3026
3027 // Step 3: All the references to the original counter outside
3028 // the loop are replaced with the NewCount
3029 if (IsCntPhiUsedOutsideLoop)
3030 CntPhi->replaceUsesOutsideBlock(NewCount, Body);
3031 else
3032 CntInst->replaceUsesOutsideBlock(NewCount, Body);
3033
3034 // step 4: Forget the "non-computable" trip-count SCEV associated with the
3035 // loop. The loop would otherwise not be deleted even if it becomes empty.
3036 SE->forgetLoop(CurLoop);
3037}
3038
3039void LoopIdiomRecognize::transformLoopToPopcount(BasicBlock *PreCondBB,
3040 Instruction *CntInst,
3041 PHINode *CntPhi, Value *Var) {
3042 BasicBlock *PreHead = CurLoop->getLoopPreheader();
3043 auto *PreCondBr = cast<CondBrInst>(PreCondBB->getTerminator());
3044 const DebugLoc &DL = CntInst->getDebugLoc();
3045
3046 // Assuming before transformation, the loop is following:
3047 // if (x) // the precondition
3048 // do { cnt++; x &= x - 1; } while(x);
3049
3050 // Step 1: Insert the ctpop instruction at the end of the precondition block
3051 IRBuilder<> Builder(PreCondBr);
3052 Value *PopCnt, *NewCount, *TripCnt;
3053 {
3054 PopCnt = createPopcntIntrinsic(Builder, Var, DL);
3055 NewCount =
3056 Builder.CreateZExtOrTrunc(PopCnt, cast<IntegerType>(CntPhi->getType()));
3057
3058 if (NewCount != PopCnt)
3059 (cast<Instruction>(NewCount))->setDebugLoc(DL);
3060
3061 // TripCnt is exactly the number of iterations the loop has
3062 TripCnt = PopCnt;
3063
3064 // If the population counter's initial value is not zero, insert Add Inst.
3065 Value *CntInitVal = CntPhi->getIncomingValueForBlock(PreHead);
3066 ConstantInt *InitConst = dyn_cast<ConstantInt>(CntInitVal);
3067 if (!InitConst || !InitConst->isZero()) {
3068 NewCount = Builder.CreateAdd(NewCount, CntInitVal);
3069 (cast<Instruction>(NewCount))->setDebugLoc(DL);
3070 }
3071 }
3072
3073 // Step 2: Replace the precondition from "if (x == 0) goto loop-exit" to
3074 // "if (TripCnt == 0) loop-exit". Without this change, the intrinsic
3075 // function would be partial dead code, and downstream passes will drag
3076 // it back from the precondition block to the preheader.
3077 {
3078 ICmpInst *PreCond = cast<ICmpInst>(PreCondBr->getCondition());
3079
3080 Value *Opnd0 = TripCnt;
3081 Value *Opnd1 = ConstantInt::get(TripCnt->getType(), 0);
3082 if (PreCond->getOperand(0) != Var)
3083 std::swap(Opnd0, Opnd1);
3084
3085 ICmpInst *NewPreCond = cast<ICmpInst>(
3086 Builder.CreateICmp(PreCond->getPredicate(), Opnd0, Opnd1));
3087 PreCondBr->setCondition(NewPreCond);
3088
3090 }
3091
3092 // Step 3: Note that the population count is exactly the trip count of the
3093 // loop in question, which enable us to convert the loop from noncountable
3094 // loop into a countable one. The benefit is twofold:
3095 //
3096 // - If the loop only counts population, the entire loop becomes dead after
3097 // the transformation. It is a lot easier to prove a countable loop dead
3098 // than to prove a noncountable one. (In some C dialects, an infinite loop
3099 // isn't dead even if it computes nothing useful. In general, DCE needs
3100 // to prove a noncountable loop finite before safely delete it.)
3101 //
3102 // - If the loop also performs something else, it remains alive.
3103 // Since it is transformed to countable form, it can be aggressively
3104 // optimized by some optimizations which are in general not applicable
3105 // to a noncountable loop.
3106 //
3107 // After this step, this loop (conceptually) would look like following:
3108 // newcnt = __builtin_ctpop(x);
3109 // t = newcnt;
3110 // if (x)
3111 // do { cnt++; x &= x-1; t--) } while (t > 0);
3112 BasicBlock *Body = *(CurLoop->block_begin());
3113 {
3114 auto *LbBr = cast<CondBrInst>(Body->getTerminator());
3115 ICmpInst *LbCond = cast<ICmpInst>(LbBr->getCondition());
3116 Type *Ty = TripCnt->getType();
3117
3118 PHINode *TcPhi = PHINode::Create(Ty, 2, "tcphi");
3119 TcPhi->insertBefore(Body->begin());
3120
3121 Builder.SetInsertPoint(LbCond);
3123 Builder.CreateSub(TcPhi, ConstantInt::get(Ty, 1), "tcdec",
3124 /*HasNUW=*/true, /*HasNSW=*/false));
3125
3126 TcPhi->addIncoming(TripCnt, PreHead);
3127 TcPhi->addIncoming(TcDec, Body);
3128
3129 CmpInst::Predicate Pred =
3130 (LbBr->getSuccessor(0) == Body) ? CmpInst::ICMP_UGT : CmpInst::ICMP_EQ;
3131 LbCond->setPredicate(Pred);
3132 LbCond->setOperand(0, TcDec);
3133 LbCond->setOperand(1, ConstantInt::get(Ty, 0));
3134 }
3135
3136 // Step 4: All the references to the original population counter outside
3137 // the loop are replaced with the NewCount -- the value returned from
3138 // __builtin_ctpop().
3139 CntInst->replaceUsesOutsideBlock(NewCount, Body);
3140
3141 // step 5: Forget the "non-computable" trip-count SCEV associated with the
3142 // loop. The loop would otherwise not be deleted even if it becomes empty.
3143 SE->forgetLoop(CurLoop);
3144}
3145
3146/// Match loop-invariant value.
3147template <typename SubPattern_t> struct match_LoopInvariant {
3148 SubPattern_t SubPattern;
3149 const Loop *L;
3150
3151 match_LoopInvariant(const SubPattern_t &SP, const Loop *L)
3152 : SubPattern(SP), L(L) {}
3153
3154 template <typename ITy> bool match(ITy *V) const {
3155 return L->isLoopInvariant(V) && SubPattern.match(V);
3156 }
3157};
3158
3159/// Matches if the value is loop-invariant.
3160template <typename Ty>
3161inline match_LoopInvariant<Ty> m_LoopInvariant(const Ty &M, const Loop *L) {
3162 return match_LoopInvariant<Ty>(M, L);
3163}
3164
3165/// Return true if the idiom is detected in the loop.
3166///
3167/// The core idiom we are trying to detect is:
3168/// \code
3169/// entry:
3170/// <...>
3171/// %bitmask = shl i32 1, %bitpos
3172/// br label %loop
3173///
3174/// loop:
3175/// %x.curr = phi i32 [ %x, %entry ], [ %x.next, %loop ]
3176/// %x.curr.bitmasked = and i32 %x.curr, %bitmask
3177/// %x.curr.isbitunset = icmp eq i32 %x.curr.bitmasked, 0
3178/// %x.next = shl i32 %x.curr, 1
3179/// <...>
3180/// br i1 %x.curr.isbitunset, label %loop, label %end
3181///
3182/// end:
3183/// %x.curr.res = phi i32 [ %x.curr, %loop ] <...>
3184/// %x.next.res = phi i32 [ %x.next, %loop ] <...>
3185/// <...>
3186/// \endcode
3187static bool detectShiftUntilBitTestIdiom(Loop *CurLoop, Value *&BaseX,
3188 Value *&BitMask, Value *&BitPos,
3189 Value *&CurrX, Instruction *&NextX) {
3191 " Performing shift-until-bittest idiom detection.\n");
3192
3193 // Give up if the loop has multiple blocks or multiple backedges.
3194 if (CurLoop->getNumBlocks() != 1 || CurLoop->getNumBackEdges() != 1) {
3195 LLVM_DEBUG(dbgs() << DEBUG_TYPE " Bad block/backedge count.\n");
3196 return false;
3197 }
3198
3199 BasicBlock *LoopHeaderBB = CurLoop->getHeader();
3200 BasicBlock *LoopPreheaderBB = CurLoop->getLoopPreheader();
3201 assert(LoopPreheaderBB && "There is always a loop preheader.");
3202
3203 using namespace PatternMatch;
3204
3205 // Step 1: Check if the loop backedge is in desirable form.
3206
3207 CmpPredicate Pred;
3208 Value *CmpLHS, *CmpRHS;
3209 BasicBlock *TrueBB, *FalseBB;
3210 if (!match(LoopHeaderBB->getTerminator(),
3211 m_Br(m_ICmp(Pred, m_Value(CmpLHS), m_Value(CmpRHS)),
3212 m_BasicBlock(TrueBB), m_BasicBlock(FalseBB)))) {
3213 LLVM_DEBUG(dbgs() << DEBUG_TYPE " Bad backedge structure.\n");
3214 return false;
3215 }
3216
3217 // Step 2: Check if the backedge's condition is in desirable form.
3218
3219 auto MatchVariableBitMask = [&]() {
3220 return ICmpInst::isEquality(Pred) && match(CmpRHS, m_Zero()) &&
3221 match(CmpLHS,
3222 m_c_And(m_Value(CurrX),
3224 m_Value(BitMask),
3225 m_LoopInvariant(m_Shl(m_One(), m_Value(BitPos)),
3226 CurLoop))));
3227 };
3228
3229 auto MatchDecomposableConstantBitMask = [&]() {
3230 auto Res = llvm::decomposeBitTestICmp(
3231 CmpLHS, CmpRHS, Pred, /*LookThroughTrunc=*/true,
3232 /*AllowNonZeroC=*/false, /*DecomposeAnd=*/true);
3233 if (Res && Res->Mask.isPowerOf2()) {
3234 assert(ICmpInst::isEquality(Res->Pred));
3235 Pred = Res->Pred;
3236 CurrX = Res->X;
3237 BitMask = ConstantInt::get(CurrX->getType(), Res->Mask);
3238 BitPos = ConstantInt::get(CurrX->getType(), Res->Mask.logBase2());
3239 return true;
3240 }
3241 return false;
3242 };
3243
3244 if (!MatchVariableBitMask() && !MatchDecomposableConstantBitMask()) {
3245 LLVM_DEBUG(dbgs() << DEBUG_TYPE " Bad backedge comparison.\n");
3246 return false;
3247 }
3248
3249 // Step 3: Check if the recurrence is in desirable form.
3250 auto *CurrXPN = dyn_cast<PHINode>(CurrX);
3251 if (!CurrXPN || CurrXPN->getParent() != LoopHeaderBB) {
3252 LLVM_DEBUG(dbgs() << DEBUG_TYPE " Not an expected PHI node.\n");
3253 return false;
3254 }
3255
3256 BaseX = CurrXPN->getIncomingValueForBlock(LoopPreheaderBB);
3257 NextX =
3258 dyn_cast<Instruction>(CurrXPN->getIncomingValueForBlock(LoopHeaderBB));
3259
3260 assert(CurLoop->isLoopInvariant(BaseX) &&
3261 "Expected BaseX to be available in the preheader!");
3262
3263 if (!NextX || (!match(NextX, m_Shl(m_Specific(CurrX), m_One())) &&
3264 !match(NextX, m_LShr(m_Specific(CurrX), m_One())))) {
3265 LLVM_DEBUG(dbgs() << DEBUG_TYPE " Bad recurrence.\n");
3266 return false;
3267 }
3268
3269 // Step 4: Check if the backedge's destinations are in desirable form.
3270
3272 "Should only get equality predicates here.");
3273
3274 // cmp-br is commutative, so canonicalize to a single variant.
3275 if (Pred != ICmpInst::Predicate::ICMP_EQ) {
3276 Pred = ICmpInst::getInversePredicate(Pred);
3277 std::swap(TrueBB, FalseBB);
3278 }
3279
3280 // We expect to exit loop when comparison yields false,
3281 // so when it yields true we should branch back to loop header.
3282 if (TrueBB != LoopHeaderBB) {
3283 LLVM_DEBUG(dbgs() << DEBUG_TYPE " Bad backedge flow.\n");
3284 return false;
3285 }
3286
3287 // Okay, idiom checks out.
3288 return true;
3289}
3290
3292 BasicBlock *Preheader,
3293 const DataLayout &DL,
3294 DominatorTree *DT) {
3295 using namespace PatternMatch;
3296
3297 auto *Pos = dyn_cast<ConstantInt>(BitPos);
3298 unsigned Bitwidth = X->getType()->getScalarSizeInBits();
3299 if (!Pos || Bitwidth == 1 || Pos->getValue().uge(Bitwidth))
3300 return false;
3301
3302 SimplifyQuery SQ(DL, DT, /*AC=*/nullptr, Preheader->getTerminator());
3303 if (!isKnownNonZero(X, SQ))
3304 return false;
3305 if (Pos->isZero())
3306 return true;
3307
3308 // The guard must rule out set bits below BitPos; those bits can never
3309 // reach the tested position when X shifts right.
3310 BasicBlock *GuardBB = Preheader->getSinglePredecessor();
3311 if (!GuardBB)
3312 return false;
3313 auto *Guard = dyn_cast<CondBrInst>(GuardBB->getTerminator());
3314 if (!Guard)
3315 return false;
3316
3317 CmpPredicate Pred;
3318 Value *LHS;
3319 if (!match(Guard->getCondition(), m_ICmp(Pred, m_Value(LHS), m_Zero())) ||
3320 !ICmpInst::isEquality(Pred))
3321 return false;
3322
3323 const APInt *Mask;
3324 if (!match(LHS, m_And(m_Specific(X), m_APInt(Mask))))
3325 return false;
3326
3327 BasicBlock *ZeroSuccessor =
3328 Guard->getSuccessor(Pred == ICmpInst::ICMP_EQ ? 0 : 1);
3329 if (ZeroSuccessor != Preheader)
3330 return false;
3331
3332 return Mask->countr_one() >= Pos->getZExtValue();
3333}
3334
3335/// Look for the following loop:
3336/// \code
3337/// entry:
3338/// <...>
3339/// %bitmask = shl i32 1, %bitpos
3340/// br label %loop
3341///
3342/// loop:
3343/// %x.curr = phi i32 [ %x, %entry ], [ %x.next, %loop ]
3344/// %x.curr.bitmasked = and i32 %x.curr, %bitmask
3345/// %x.curr.isbitunset = icmp eq i32 %x.curr.bitmasked, 0
3346/// %x.next = shl i32 %x.curr, 1
3347/// <...>
3348/// br i1 %x.curr.isbitunset, label %loop, label %end
3349///
3350/// end:
3351/// %x.curr.res = phi i32 [ %x.curr, %loop ] <...>
3352/// %x.next.res = phi i32 [ %x.next, %loop ] <...>
3353/// <...>
3354/// \endcode
3355///
3356/// And transform it into:
3357/// \code
3358/// entry:
3359/// %bitmask = shl i32 1, %bitpos
3360/// %lowbitmask = add i32 %bitmask, -1
3361/// %mask = or i32 %lowbitmask, %bitmask
3362/// %x.masked = and i32 %x, %mask
3363/// %x.masked.numleadingzeros = call i32 @llvm.ctlz.i32(i32 %x.masked,
3364/// i1 true)
3365/// %x.masked.numactivebits = sub i32 32, %x.masked.numleadingzeros
3366/// %x.masked.leadingonepos = add i32 %x.masked.numactivebits, -1
3367/// %backedgetakencount = sub i32 %bitpos, %x.masked.leadingonepos
3368/// %tripcount = add i32 %backedgetakencount, 1
3369/// %x.curr = shl i32 %x, %backedgetakencount
3370/// %x.next = shl i32 %x, %tripcount
3371/// br label %loop
3372///
3373/// loop:
3374/// %loop.iv = phi i32 [ 0, %entry ], [ %loop.iv.next, %loop ]
3375/// %loop.iv.next = add nuw i32 %loop.iv, 1
3376/// %loop.ivcheck = icmp eq i32 %loop.iv.next, %tripcount
3377/// <...>
3378/// br i1 %loop.ivcheck, label %end, label %loop
3379///
3380/// end:
3381/// %x.curr.res = phi i32 [ %x.curr, %loop ] <...>
3382/// %x.next.res = phi i32 [ %x.next, %loop ] <...>
3383/// <...>
3384/// \endcode
3385/// A logical right-shift recurrence uses cttz of X shifted by BitPos instead,
3386/// provided the preheader proves that the loop will reach a set bit.
3387bool LoopIdiomRecognize::recognizeShiftUntilBitTest() {
3388 bool MadeChange = false;
3389
3390 Value *X, *BitMask, *BitPos, *XCurr;
3391 Instruction *XNext;
3392 if (!detectShiftUntilBitTestIdiom(CurLoop, X, BitMask, BitPos, XCurr,
3393 XNext)) {
3395 " shift-until-bittest idiom detection failed.\n");
3396 return MadeChange;
3397 }
3398 LLVM_DEBUG(dbgs() << DEBUG_TYPE " shift-until-bittest idiom detected!\n");
3399
3400 // Ok, it is the idiom we were looking for, we *could* transform this loop,
3401 // but is it profitable to transform?
3402
3403 BasicBlock *LoopHeaderBB = CurLoop->getHeader();
3404 BasicBlock *LoopPreheaderBB = CurLoop->getLoopPreheader();
3405 assert(LoopPreheaderBB && "There is always a loop preheader.");
3406
3407 BasicBlock *SuccessorBB = CurLoop->getExitBlock();
3408 assert(SuccessorBB && "There is only a single successor.");
3409
3410 IRBuilder<> Builder(LoopPreheaderBB->getTerminator());
3411 Builder.SetCurrentDebugLocation(cast<Instruction>(XCurr)->getDebugLoc());
3412
3413 bool IsRightShift = XNext->getOpcode() == Instruction::LShr;
3414 Intrinsic::ID IntrID = IsRightShift ? Intrinsic::cttz : Intrinsic::ctlz;
3415 Type *Ty = X->getType();
3416 unsigned Bitwidth = Ty->getScalarSizeInBits();
3417
3418 // A right shift must be guaranteed to reach a set bit at BitPos.
3419 if (IsRightShift && !isRightShiftBitTestKnownToTerminate(
3420 X, BitPos, LoopPreheaderBB, *DL, DT)) {
3421 return false;
3422 }
3423
3426
3427 // The rewrite is considered to be unprofitable iff and only iff the
3428 // intrinsic/shift we'll use are not cheap. Note that we are okay with *just*
3429 // making the loop countable, even if nothing else changes.
3431 IntrID, Ty, {PoisonValue::get(Ty), /*is_zero_poison=*/Builder.getTrue()});
3432 InstructionCost Cost = TTI->getIntrinsicInstrCost(Attrs, CostKind);
3435 " Intrinsic is too costly, not beneficial\n");
3436 return MadeChange;
3437 }
3438 if (TTI->getArithmeticInstrCost(XNext->getOpcode(), Ty, CostKind) >
3440 LLVM_DEBUG(dbgs() << DEBUG_TYPE " Shift is too costly, not beneficial\n");
3441 return MadeChange;
3442 }
3443
3444 // Ok, transform appears worthwhile.
3445 MadeChange = true;
3446
3447 if (!isGuaranteedNotToBeUndefOrPoison(BitPos)) {
3448 // BitMask may be computed from BitPos, Freeze BitPos so we can increase
3449 // it's use count.
3450 std::optional<BasicBlock::iterator> InsertPt = std::nullopt;
3451 if (auto *BitPosI = dyn_cast<Instruction>(BitPos))
3452 InsertPt = BitPosI->getInsertionPointAfterDef();
3453 else
3454 InsertPt = DT->getRoot()->getFirstNonPHIOrAlloca();
3455 if (!InsertPt)
3456 return false;
3457 FreezeInst *BitPosFrozen =
3458 new FreezeInst(BitPos, BitPos->getName() + ".fr", *InsertPt);
3459 BitPos->replaceUsesWithIf(BitPosFrozen, [BitPosFrozen](Use &U) {
3460 return U.getUser() != BitPosFrozen;
3461 });
3462 BitPos = BitPosFrozen;
3463 }
3464
3465 // Step 1: Compute the loop trip count.
3466
3467 Value *LoopBackedgeTakenCount;
3468 if (IsRightShift) {
3469 Value *ShiftedX = Builder.CreateLShr(X, BitPos);
3470 LoopBackedgeTakenCount = Builder.CreateIntrinsic(
3471 IntrID, Ty, {ShiftedX, /*is_zero_poison=*/Builder.getTrue()});
3472 } else {
3473 Value *LowBitMask =
3474 Builder.CreateAdd(BitMask, Constant::getAllOnesValue(Ty),
3475 BitPos->getName() + ".lowbitmask");
3476 Value *Mask =
3477 Builder.CreateOr(LowBitMask, BitMask, BitPos->getName() + ".mask");
3478 Value *XMasked = Builder.CreateAnd(X, Mask, X->getName() + ".masked");
3479 Value *XMaskedNumLeadingZeros = Builder.CreateIntrinsic(
3480 IntrID, Ty, {XMasked, /*is_zero_poison=*/Builder.getTrue()},
3481 /*FMFSource=*/nullptr, XMasked->getName() + ".numleadingzeros");
3482 Value *XMaskedNumActiveBits = Builder.CreateSub(
3483 ConstantInt::get(Ty, Ty->getScalarSizeInBits()), XMaskedNumLeadingZeros,
3484 XMasked->getName() + ".numactivebits",
3485 /*HasNUW=*/true, /*HasNSW=*/Bitwidth != 2);
3486 Value *XMaskedLeadingOnePos = Builder.CreateAdd(
3487 XMaskedNumActiveBits, Constant::getAllOnesValue(Ty),
3488 XMasked->getName() + ".leadingonepos", /*HasNUW=*/false,
3489 /*HasNSW=*/Bitwidth > 2);
3490
3491 LoopBackedgeTakenCount = Builder.CreateSub(
3492 BitPos, XMaskedLeadingOnePos,
3493 CurLoop->getName() + ".backedgetakencount", /*HasNUW=*/true,
3494 /*HasNSW=*/true);
3495 }
3496 // We know loop's backedge-taken count, but what's loop's trip count?
3497 // Note that while NUW is always safe, while NSW is only for bitwidths != 2.
3498 Value *LoopTripCount =
3499 Builder.CreateAdd(LoopBackedgeTakenCount, ConstantInt::get(Ty, 1),
3500 CurLoop->getName() + ".tripcount", /*HasNUW=*/true,
3501 /*HasNSW=*/Bitwidth != 2);
3502
3503 // Step 2: Compute the recurrence's final value without a loop.
3504
3505 // NewX is always safe to compute, because `LoopBackedgeTakenCount`
3506 // will always be smaller than `bitwidth(X)`, i.e. we never get poison.
3507 Value *NewX = IsRightShift ? Builder.CreateLShr(X, LoopBackedgeTakenCount)
3508 : Builder.CreateShl(X, LoopBackedgeTakenCount);
3509 NewX->takeName(XCurr);
3510 if (auto *I = dyn_cast<Instruction>(NewX))
3511 I->copyIRFlags(XNext, /*IncludeWrapFlags=*/true);
3512
3513 Value *NewXNext;
3514 // Shifting X by LoopTripCount is poison if the count equals Bitwidth.
3515 // For right shifts, shift NewX by one instead. For left shifts, this can
3516 // happen when BitPos is the highest bit and X is one, so use a single
3517 // additional shift unless the larger shift is known to be safe.
3518 if (IsRightShift) {
3519 NewXNext = Builder.CreateLShr(NewX, ConstantInt::get(Ty, 1));
3520 } else if (XNext->hasNoSignedWrap() || XNext->hasNoUnsignedWrap() ||
3521 PatternMatch::match(BitPos,
3525 Ty->getScalarSizeInBits() - 1)))) {
3526 NewXNext = Builder.CreateShl(X, LoopTripCount);
3527 } else {
3528 // Otherwise, just additionally shift by one. It's the smallest solution,
3529 // alternatively, we could check that NewX is INT_MIN (or BitPos is )
3530 // and select 0 instead.
3531 NewXNext = Builder.CreateShl(NewX, ConstantInt::get(Ty, 1));
3532 }
3533
3534 NewXNext->takeName(XNext);
3535 if (auto *I = dyn_cast<Instruction>(NewXNext))
3536 I->copyIRFlags(XNext, /*IncludeWrapFlags=*/true);
3537
3538 // Step 3: Adjust the successor basic block to receive the computed
3539 // recurrence's final value instead of the recurrence itself.
3540
3541 XCurr->replaceUsesOutsideBlock(NewX, LoopHeaderBB);
3542 XNext->replaceUsesOutsideBlock(NewXNext, LoopHeaderBB);
3543
3544 // Step 4: Rewrite the loop into a countable form, with canonical IV.
3545
3546 // The new canonical induction variable.
3547 Builder.SetInsertPoint(LoopHeaderBB->begin());
3548 auto *IV = Builder.CreatePHI(Ty, 2, CurLoop->getName() + ".iv");
3549
3550 // The induction itself.
3551 // Note that while NUW is always safe, while NSW is only for bitwidths != 2.
3552 Builder.SetInsertPoint(LoopHeaderBB->getTerminator());
3553 auto *IVNext =
3554 Builder.CreateAdd(IV, ConstantInt::get(Ty, 1), IV->getName() + ".next",
3555 /*HasNUW=*/true, /*HasNSW=*/Bitwidth != 2);
3556
3557 // The loop trip count check.
3558 auto *IVCheck = Builder.CreateICmpEQ(IVNext, LoopTripCount,
3559 CurLoop->getName() + ".ivcheck");
3560 SmallVector<uint32_t> BranchWeights;
3561 const bool HasBranchWeights =
3562 extractBranchWeights(*LoopHeaderBB->getTerminator(), BranchWeights);
3563
3564 auto *BI = Builder.CreateCondBr(IVCheck, SuccessorBB, LoopHeaderBB);
3565 if (HasBranchWeights) {
3566 if (SuccessorBB == LoopHeaderBB->getTerminator()->getSuccessor(1))
3567 std::swap(BranchWeights[0], BranchWeights[1]);
3568 // We're not changing the loop profile, so we can reuse the original loop's
3569 // profile.
3570 setBranchWeights(*BI, BranchWeights,
3571 /*IsExpected=*/false);
3572 }
3573
3574 LoopHeaderBB->getTerminator()->eraseFromParent();
3575
3576 // Populate the IV PHI.
3577 IV->addIncoming(ConstantInt::get(Ty, 0), LoopPreheaderBB);
3578 IV->addIncoming(IVNext, LoopHeaderBB);
3579
3580 // Step 5: Forget the "non-computable" trip-count SCEV associated with the
3581 // loop. The loop would otherwise not be deleted even if it becomes empty.
3582
3583 SE->forgetLoop(CurLoop);
3584
3585 // Other passes will take care of actually deleting the loop if possible.
3586
3587 LLVM_DEBUG(dbgs() << DEBUG_TYPE " shift-until-bittest idiom optimized!\n");
3588
3589 ++NumShiftUntilBitTest;
3590 return MadeChange;
3591}
3592
3593/// Return true if the idiom is detected in the loop.
3594///
3595/// The core idiom we are trying to detect is:
3596/// \code
3597/// entry:
3598/// <...>
3599/// %start = <...>
3600/// %extraoffset = <...>
3601/// <...>
3602/// br label %for.cond
3603///
3604/// loop:
3605/// %iv = phi i8 [ %start, %entry ], [ %iv.next, %for.cond ]
3606/// %nbits = add nsw i8 %iv, %extraoffset
3607/// %val.shifted = {{l,a}shr,shl} i8 %val, %nbits
3608/// %val.shifted.iszero = icmp eq i8 %val.shifted, 0
3609/// %iv.next = add i8 %iv, 1
3610/// <...>
3611/// br i1 %val.shifted.iszero, label %end, label %loop
3612///
3613/// end:
3614/// %iv.res = phi i8 [ %iv, %loop ] <...>
3615/// %nbits.res = phi i8 [ %nbits, %loop ] <...>
3616/// %val.shifted.res = phi i8 [ %val.shifted, %loop ] <...>
3617/// %val.shifted.iszero.res = phi i1 [ %val.shifted.iszero, %loop ] <...>
3618/// %iv.next.res = phi i8 [ %iv.next, %loop ] <...>
3619/// <...>
3620/// \endcode
3622 Instruction *&ValShiftedIsZero,
3623 Intrinsic::ID &IntrinID, Instruction *&IV,
3624 Value *&Start, Value *&Val,
3625 const SCEV *&ExtraOffsetExpr,
3626 bool &InvertedCond) {
3628 " Performing shift-until-zero idiom detection.\n");
3629
3630 // Give up if the loop has multiple blocks or multiple backedges.
3631 if (CurLoop->getNumBlocks() != 1 || CurLoop->getNumBackEdges() != 1) {
3632 LLVM_DEBUG(dbgs() << DEBUG_TYPE " Bad block/backedge count.\n");
3633 return false;
3634 }
3635
3636 Instruction *ValShifted, *NBits, *IVNext;
3637 Value *ExtraOffset;
3638
3639 BasicBlock *LoopHeaderBB = CurLoop->getHeader();
3640 BasicBlock *LoopPreheaderBB = CurLoop->getLoopPreheader();
3641 assert(LoopPreheaderBB && "There is always a loop preheader.");
3642
3643 using namespace PatternMatch;
3644
3645 // Step 1: Check if the loop backedge, condition is in desirable form.
3646
3647 CmpPredicate Pred;
3648 BasicBlock *TrueBB, *FalseBB;
3649 if (!match(LoopHeaderBB->getTerminator(),
3650 m_Br(m_Instruction(ValShiftedIsZero), m_BasicBlock(TrueBB),
3651 m_BasicBlock(FalseBB))) ||
3652 !match(ValShiftedIsZero,
3653 m_ICmp(Pred, m_Instruction(ValShifted), m_Zero())) ||
3654 !ICmpInst::isEquality(Pred)) {
3655 LLVM_DEBUG(dbgs() << DEBUG_TYPE " Bad backedge structure.\n");
3656 return false;
3657 }
3658
3659 // Step 2: Check if the comparison's operand is in desirable form.
3660 // FIXME: Val could be a one-input PHI node, which we should look past.
3661 if (!match(ValShifted, m_Shift(m_LoopInvariant(m_Value(Val), CurLoop),
3662 m_Instruction(NBits)))) {
3663 LLVM_DEBUG(dbgs() << DEBUG_TYPE " Bad comparisons value computation.\n");
3664 return false;
3665 }
3666 IntrinID = ValShifted->getOpcode() == Instruction::Shl ? Intrinsic::cttz
3667 : Intrinsic::ctlz;
3668
3669 // Step 3: Check if the shift amount is in desirable form.
3670
3671 if (match(NBits, m_c_Add(m_Instruction(IV),
3672 m_LoopInvariant(m_Value(ExtraOffset), CurLoop))) &&
3673 (NBits->hasNoSignedWrap() || NBits->hasNoUnsignedWrap()))
3674 ExtraOffsetExpr = SE->getNegativeSCEV(SE->getSCEV(ExtraOffset));
3675 else if (match(NBits,
3677 m_LoopInvariant(m_Value(ExtraOffset), CurLoop))) &&
3678 NBits->hasNoSignedWrap())
3679 ExtraOffsetExpr = SE->getSCEV(ExtraOffset);
3680 else {
3681 IV = NBits;
3682 ExtraOffsetExpr = SE->getZero(NBits->getType());
3683 }
3684
3685 // Step 4: Check if the recurrence is in desirable form.
3686 auto *IVPN = dyn_cast<PHINode>(IV);
3687 if (!IVPN || IVPN->getParent() != LoopHeaderBB) {
3688 LLVM_DEBUG(dbgs() << DEBUG_TYPE " Not an expected PHI node.\n");
3689 return false;
3690 }
3691
3692 Start = IVPN->getIncomingValueForBlock(LoopPreheaderBB);
3693 IVNext = dyn_cast<Instruction>(IVPN->getIncomingValueForBlock(LoopHeaderBB));
3694
3695 if (!IVNext || !match(IVNext, m_Add(m_Specific(IVPN), m_One()))) {
3696 LLVM_DEBUG(dbgs() << DEBUG_TYPE " Bad recurrence.\n");
3697 return false;
3698 }
3699
3700 // Step 4: Check if the backedge's destinations are in desirable form.
3701
3703 "Should only get equality predicates here.");
3704
3705 // cmp-br is commutative, so canonicalize to a single variant.
3706 InvertedCond = Pred != ICmpInst::Predicate::ICMP_EQ;
3707 if (InvertedCond) {
3708 Pred = ICmpInst::getInversePredicate(Pred);
3709 std::swap(TrueBB, FalseBB);
3710 }
3711
3712 // We expect to exit loop when comparison yields true,
3713 // so when it yields false we should branch back to loop header.
3714 if (FalseBB != LoopHeaderBB) {
3715 LLVM_DEBUG(dbgs() << DEBUG_TYPE " Bad backedge flow.\n");
3716 return false;
3717 }
3718
3719 // The new, countable, loop will certainly only run a known number of
3720 // iterations, It won't be infinite. But the old loop might be infinite
3721 // under certain conditions. For logical shifts, the value will become zero
3722 // after at most bitwidth(%Val) loop iterations. However, for arithmetic
3723 // right-shift, iff the sign bit was set, the value will never become zero,
3724 // and the loop may never finish.
3725 if (ValShifted->getOpcode() == Instruction::AShr &&
3726 !isMustProgress(CurLoop) && !SE->isKnownNonNegative(SE->getSCEV(Val))) {
3727 LLVM_DEBUG(dbgs() << DEBUG_TYPE " Can not prove the loop is finite.\n");
3728 return false;
3729 }
3730
3731 // Okay, idiom checks out.
3732 return true;
3733}
3734
3735/// Look for the following loop:
3736/// \code
3737/// entry:
3738/// <...>
3739/// %start = <...>
3740/// %extraoffset = <...>
3741/// <...>
3742/// br label %loop
3743///
3744/// loop:
3745/// %iv = phi i8 [ %start, %entry ], [ %iv.next, %loop ]
3746/// %nbits = add nsw i8 %iv, %extraoffset
3747/// %val.shifted = {{l,a}shr,shl} i8 %val, %nbits
3748/// %val.shifted.iszero = icmp eq i8 %val.shifted, 0
3749/// %iv.next = add i8 %iv, 1
3750/// <...>
3751/// br i1 %val.shifted.iszero, label %end, label %loop
3752///
3753/// end:
3754/// %iv.res = phi i8 [ %iv, %loop ] <...>
3755/// %nbits.res = phi i8 [ %nbits, %loop ] <...>
3756/// %val.shifted.res = phi i8 [ %val.shifted, %loop ] <...>
3757/// %val.shifted.iszero.res = phi i1 [ %val.shifted.iszero, %loop ] <...>
3758/// %iv.next.res = phi i8 [ %iv.next, %loop ] <...>
3759/// <...>
3760/// \endcode
3761///
3762/// And transform it into:
3763/// \code
3764/// entry:
3765/// <...>
3766/// %start = <...>
3767/// %extraoffset = <...>
3768/// <...>
3769/// %val.numleadingzeros = call i8 @llvm.ct{l,t}z.i8(i8 %val, i1 0)
3770/// %val.numactivebits = sub i8 8, %val.numleadingzeros
3771/// %extraoffset.neg = sub i8 0, %extraoffset
3772/// %tmp = add i8 %val.numactivebits, %extraoffset.neg
3773/// %iv.final = call i8 @llvm.smax.i8(i8 %tmp, i8 %start)
3774/// %loop.tripcount = sub i8 %iv.final, %start
3775/// br label %loop
3776///
3777/// loop:
3778/// %loop.iv = phi i8 [ 0, %entry ], [ %loop.iv.next, %loop ]
3779/// %loop.iv.next = add i8 %loop.iv, 1
3780/// %loop.ivcheck = icmp eq i8 %loop.iv.next, %loop.tripcount
3781/// %iv = add i8 %loop.iv, %start
3782/// <...>
3783/// br i1 %loop.ivcheck, label %end, label %loop
3784///
3785/// end:
3786/// %iv.res = phi i8 [ %iv.final, %loop ] <...>
3787/// <...>
3788/// \endcode
3789bool LoopIdiomRecognize::recognizeShiftUntilZero() {
3790 bool MadeChange = false;
3791
3792 Instruction *ValShiftedIsZero;
3793 Intrinsic::ID IntrID;
3794 Instruction *IV;
3795 Value *Start, *Val;
3796 const SCEV *ExtraOffsetExpr;
3797 bool InvertedCond;
3798 if (!detectShiftUntilZeroIdiom(CurLoop, SE, ValShiftedIsZero, IntrID, IV,
3799 Start, Val, ExtraOffsetExpr, InvertedCond)) {
3801 " shift-until-zero idiom detection failed.\n");
3802 return MadeChange;
3803 }
3804 LLVM_DEBUG(dbgs() << DEBUG_TYPE " shift-until-zero idiom detected!\n");
3805
3806 // Ok, it is the idiom we were looking for, we *could* transform this loop,
3807 // but is it profitable to transform?
3808
3809 BasicBlock *LoopHeaderBB = CurLoop->getHeader();
3810 BasicBlock *LoopPreheaderBB = CurLoop->getLoopPreheader();
3811 assert(LoopPreheaderBB && "There is always a loop preheader.");
3812
3813 BasicBlock *SuccessorBB = CurLoop->getExitBlock();
3814 assert(SuccessorBB && "There is only a single successor.");
3815
3816 IRBuilder<> Builder(LoopPreheaderBB->getTerminator());
3817 Builder.SetCurrentDebugLocation(IV->getDebugLoc());
3818
3819 Type *Ty = Val->getType();
3820 unsigned Bitwidth = Ty->getScalarSizeInBits();
3821
3824
3825 // The rewrite is considered to be unprofitable iff and only iff the
3826 // intrinsic we'll use are not cheap. Note that we are okay with *just*
3827 // making the loop countable, even if nothing else changes.
3829 IntrID, Ty, {PoisonValue::get(Ty), /*is_zero_poison=*/Builder.getFalse()});
3830 InstructionCost Cost = TTI->getIntrinsicInstrCost(Attrs, CostKind);
3833 " Intrinsic is too costly, not beneficial\n");
3834 return MadeChange;
3835 }
3836
3837 // Ok, transform appears worthwhile.
3838 MadeChange = true;
3839
3840 bool OffsetIsZero = ExtraOffsetExpr->isZero();
3841
3842 // Step 1: Compute the loop's final IV value / trip count.
3843
3844 Value *ValNumLeadingZeros = Builder.CreateIntrinsic(
3845 IntrID, Ty, {Val, /*is_zero_poison=*/Builder.getFalse()},
3846 /*FMFSource=*/nullptr, Val->getName() + ".numleadingzeros");
3847 Value *ValNumActiveBits = Builder.CreateSub(
3848 ConstantInt::get(Ty, Ty->getScalarSizeInBits()), ValNumLeadingZeros,
3849 Val->getName() + ".numactivebits", /*HasNUW=*/true,
3850 /*HasNSW=*/Bitwidth != 2);
3851
3852 SCEVExpander Expander(*SE, "loop-idiom");
3853 Expander.setInsertPoint(&*Builder.GetInsertPoint());
3854 Value *ExtraOffset = Expander.expandCodeFor(ExtraOffsetExpr);
3855
3856 Value *ValNumActiveBitsOffset = Builder.CreateAdd(
3857 ValNumActiveBits, ExtraOffset, ValNumActiveBits->getName() + ".offset",
3858 /*HasNUW=*/OffsetIsZero, /*HasNSW=*/true);
3859 Value *IVFinal = Builder.CreateIntrinsic(Intrinsic::smax, {Ty},
3860 {ValNumActiveBitsOffset, Start},
3861 /*FMFSource=*/nullptr, "iv.final");
3862
3863 auto *LoopBackedgeTakenCount = cast<Instruction>(Builder.CreateSub(
3864 IVFinal, Start, CurLoop->getName() + ".backedgetakencount",
3865 /*HasNUW=*/OffsetIsZero, /*HasNSW=*/true));
3866 // FIXME: or when the offset was `add nuw`
3867
3868 // We know loop's backedge-taken count, but what's loop's trip count?
3869 Value *LoopTripCount =
3870 Builder.CreateAdd(LoopBackedgeTakenCount, ConstantInt::get(Ty, 1),
3871 CurLoop->getName() + ".tripcount", /*HasNUW=*/true,
3872 /*HasNSW=*/Bitwidth != 2);
3873
3874 // Step 2: Adjust the successor basic block to receive the original
3875 // induction variable's final value instead of the orig. IV itself.
3876
3877 IV->replaceUsesOutsideBlock(IVFinal, LoopHeaderBB);
3878
3879 // Step 3: Rewrite the loop into a countable form, with canonical IV.
3880
3881 // The new canonical induction variable.
3882 Builder.SetInsertPoint(LoopHeaderBB->begin());
3883 auto *CIV = Builder.CreatePHI(Ty, 2, CurLoop->getName() + ".iv");
3884
3885 // The induction itself.
3886 Builder.SetInsertPoint(LoopHeaderBB->getFirstNonPHIIt());
3887 auto *CIVNext =
3888 Builder.CreateAdd(CIV, ConstantInt::get(Ty, 1), CIV->getName() + ".next",
3889 /*HasNUW=*/true, /*HasNSW=*/Bitwidth != 2);
3890
3891 // The loop trip count check.
3892 auto *CIVCheck = Builder.CreateICmpEQ(CIVNext, LoopTripCount,
3893 CurLoop->getName() + ".ivcheck");
3894 auto *NewIVCheck = CIVCheck;
3895 if (InvertedCond) {
3896 NewIVCheck = Builder.CreateNot(CIVCheck);
3897 NewIVCheck->takeName(ValShiftedIsZero);
3898 }
3899
3900 // The original IV, but rebased to be an offset to the CIV.
3901 auto *IVDePHId = Builder.CreateAdd(CIV, Start, "", /*HasNUW=*/false,
3902 /*HasNSW=*/true); // FIXME: what about NUW?
3903 IVDePHId->takeName(IV);
3904
3905 // The loop terminator.
3906 Builder.SetInsertPoint(LoopHeaderBB->getTerminator());
3907 SmallVector<uint32_t> BranchWeights;
3908 const bool HasBranchWeights =
3909 extractBranchWeights(*LoopHeaderBB->getTerminator(), BranchWeights);
3910
3911 auto *BI = Builder.CreateCondBr(CIVCheck, SuccessorBB, LoopHeaderBB);
3912 if (HasBranchWeights) {
3913 if (InvertedCond)
3914 std::swap(BranchWeights[0], BranchWeights[1]);
3915 // We're not changing the loop profile, so we can reuse the original loop's
3916 // profile.
3917 setBranchWeights(*BI, BranchWeights, /*IsExpected=*/false);
3918 }
3919 LoopHeaderBB->getTerminator()->eraseFromParent();
3920
3921 // Populate the IV PHI.
3922 CIV->addIncoming(ConstantInt::get(Ty, 0), LoopPreheaderBB);
3923 CIV->addIncoming(CIVNext, LoopHeaderBB);
3924
3925 // Step 4: Forget the "non-computable" trip-count SCEV associated with the
3926 // loop. The loop would otherwise not be deleted even if it becomes empty.
3927
3928 SE->forgetLoop(CurLoop);
3929
3930 // Step 5: Try to cleanup the loop's body somewhat.
3931 IV->replaceAllUsesWith(IVDePHId);
3932 IV->eraseFromParent();
3933
3934 ValShiftedIsZero->replaceAllUsesWith(NewIVCheck);
3935 ValShiftedIsZero->eraseFromParent();
3936
3937 // Other passes will take care of actually deleting the loop if possible.
3938
3939 LLVM_DEBUG(dbgs() << DEBUG_TYPE " shift-until-zero idiom optimized!\n");
3940
3941 ++NumShiftUntilZero;
3942 return MadeChange;
3943}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
uint64_t uint64_t
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static const Function * getParent(const Value *V)
#define X(NUM, ENUM, NAME)
Definition ELF.h:665
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
DXIL Resource Access
This file defines the DenseMap class.
#define DEBUG_TYPE
ManagedStatic< HTTPClientCleanup > Cleanup
static bool mayLoopAccessLocation(Value *Ptr, ModRefInfo Access, Loop *L, const SCEV *BECount, unsigned StoreSize, AliasAnalysis &AA, SmallPtrSetImpl< Instruction * > &Ignored)
mayLoopAccessLocation - Return true if the specified loop might access the specified pointer location...
IRTranslator LLVM IR MI
Module.h This file contains the declarations for the Module class.
This header defines various interfaces for pass management in LLVM.
This file defines an InstructionCost class that is used when calculating the cost of an instruction,...
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static PHINode * getRecurrenceVar(Value *VarX, Instruction *DefX, BasicBlock *LoopEntry)
static Value * createPopcntIntrinsic(IRBuilder<> &IRBuilder, Value *Val, const DebugLoc &DL)
static Value * matchShiftULTCondition(CondBrInst *BI, BasicBlock *LoopEntry, APInt &Threshold)
Check if the given conditional branch is based on an unsigned less-than comparison between a variable...
static bool detectShiftUntilLessThanIdiom(Loop *CurLoop, const DataLayout &DL, Intrinsic::ID &IntrinID, Value *&InitX, Instruction *&CntInst, PHINode *&CntPhi, Instruction *&DefX, APInt &Threshold)
Return true if the idiom is detected in the loop.
static Value * matchCondition(CondBrInst *BI, BasicBlock *LoopEntry, bool JmpOnZero=false)
Check if the given conditional branch is based on the comparison between a variable and zero,...
static bool detectShiftUntilBitTestIdiom(Loop *CurLoop, Value *&BaseX, Value *&BitMask, Value *&BitPos, Value *&CurrX, Instruction *&NextX)
Return true if the idiom is detected in the loop.
static bool detectPopcountIdiom(Loop *CurLoop, BasicBlock *PreCondBB, Instruction *&CntInst, PHINode *&CntPhi, Value *&Var)
Return true iff the idiom is detected in the loop.
static Constant * getMemSetPatternValue(Value *V, const DataLayout *DL)
getMemSetPatternValue - If a strided store of the specified value is safe to turn into a memset....
static const SCEV * getNumBytes(const SCEV *BECount, Type *IntPtr, const SCEV *StoreSizeSCEV, Loop *CurLoop, const DataLayout *DL, ScalarEvolution *SE)
Compute the number of bytes as a SCEV from the backedge taken count.
static bool detectShiftUntilZeroIdiom(Loop *CurLoop, const DataLayout &DL, Intrinsic::ID &IntrinID, Value *&InitX, Instruction *&CntInst, PHINode *&CntPhi, Instruction *&DefX)
Return true if the idiom is detected in the loop.
static Value * createFFSIntrinsic(IRBuilder<> &IRBuilder, Value *Val, const DebugLoc &DL, bool ZeroCheck, Intrinsic::ID IID)
static bool isRightShiftBitTestKnownToTerminate(Value *X, Value *BitPos, BasicBlock *Preheader, const DataLayout &DL, DominatorTree *DT)
static const SCEV * getStartForNegStride(const SCEV *Start, const SCEV *BECount, Type *IntPtr, const SCEV *StoreSizeSCEV, ScalarEvolution *SE)
static APInt getStoreStride(const SCEVAddRecExpr *StoreEv)
match_LoopInvariant< Ty > m_LoopInvariant(const Ty &M, const Loop *L)
Matches if the value is loop-invariant.
static bool isSameByteValueStore(Instruction &I, Value *SplatByte, Loop *L, const DataLayout &DL)
Return true if I is a (simple, loop-invariant-valued) store of the same bytewise value SplatByte.
static void deleteDeadInstruction(Instruction *I)
#define I(x, y, z)
Definition MD5.cpp:57
This file implements a map that provides insertion order iteration.
This file provides utility analysis objects describing memory locations.
This file exposes an interface to building/using memory SSA to walk memory instructions using a use/d...
#define T
Contains a collection of routines for determining if a given instruction is guaranteed to execute if ...
if(PassOpts->AAPipeline)
This file contains the declarations for profiling metadata utility functions.
SmallVector< MachineOperand, 4 > Cond
Func MI getDebugLoc()))
This file contains some templates that are useful if you are working with the STL at all.
verify safepoint Safepoint IR Verifier
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
#define LLVM_DEBUG(...)
Definition Debug.h:119
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
This pass exposes codegen information to IR-level passes.
Value * LHS
static const uint32_t IV[8]
Definition blake3_impl.h:83
Class for arbitrary precision integers.
Definition APInt.h:78
std::optional< uint64_t > tryZExtValue() const
Get zero extended value if possible.
Definition APInt.h:1572
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1560
bool sgt(const APInt &RHS) const
Signed greater than comparison.
Definition APInt.h:1205
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1508
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:302
bool slt(const APInt &RHS) const
Signed less than comparison.
Definition APInt.h:1134
int64_t getSExtValue() const
Get sign extended value.
Definition APInt.h:1582
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator end()
Definition BasicBlock.h:453
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:440
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
Definition BasicBlock.h:509
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
LLVM_ABI const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
const Instruction & front() const
Definition BasicBlock.h:463
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
LLVM_ABI const_iterator getFirstNonPHIOrAlloca() const
Returns an iterator to the first instruction in this block that is not a PHINode, a static alloca,...
size_t size() const
Definition BasicBlock.h:461
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
LLVM_ABI const Module * getModule() const
Return the module owning the function this basic block belongs to, or nullptr if the function does no...
BinaryOps getOpcode() const
Definition InstrTypes.h:409
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
This class represents a function call, abstracting a target machine's calling convention.
void setPredicate(Predicate P)
Set the predicate for this instruction to the specified value.
Definition InstrTypes.h:831
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:763
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:765
@ ICMP_NE
not equal
Definition InstrTypes.h:762
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Definition InstrTypes.h:852
Predicate getPredicate() const
Return the predicate for this instruction.
Definition InstrTypes.h:828
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
Conditional Branch instruction.
void setCondition(Value *V)
Value * getCondition() const
BasicBlock * getSuccessor(unsigned i) const
static LLVM_ABI Constant * get(ArrayType *T, ArrayRef< Constant * > V)
This is the shared class of boolean and integer constants.
Definition Constants.h:87
bool isMinusOne() const
This function will return true iff every bit in this constant is set to true.
Definition Constants.h:231
bool isOne() const
This is just a convenience method to make client code smaller for a common case.
Definition Constants.h:225
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition Constants.h:219
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
Definition Constants.h:168
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
static LLVM_ABI ConstantInt * getBool(LLVMContext &Context, bool V)
This is an important base class in LLVM.
Definition Constant.h:44
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
LLVM_ABI IntegerType * getIndexType(LLVMContext &C, unsigned AddressSpace) const
Returns the type of a GEP index in AddressSpace.
A debug info location.
Definition DebugLoc.h:126
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:122
LLVM_ABI bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
This class represents a freeze function that returns random concrete value if an operand is either a ...
PointerType * getType() const
Global values are always pointers.
@ PrivateLinkage
Like Internal, but omit from symbol table.
Definition GlobalValue.h:61
static LLVM_ABI CRCTable genSarwateTable(const APInt &GenPoly, bool IsBigEndian)
Generate a lookup table of 256 entries by interleaving the generating polynomial.
static LLVM_ABI std::pair< APInt, APInt > genBarrettConstants(const PolynomialInfo &Info)
Auxilary entry point after analysis to generate constants for a GF(2) Barrett Reduction.
This instruction compares its operands according to the predicate given to the constructor.
bool isEquality() const
Return true if this predicate is either EQ or NE.
static bool isEquality(Predicate P)
Return true if this predicate is either EQ or NE.
Common base class shared among various IRBuilders.
Definition IRBuilder.h:111
ConstantInt * getInt1(bool V)
Get a constant value representing either true or false.
Definition IRBuilder.h:440
Value * CreateZExtOrTrunc(Value *V, Type *DestTy, const Twine &Name="")
Create a ZExt or Trunc from the integer value V to DestTy.
Definition IRBuilder.h:2139
void SetCurrentDebugLocation(const DebugLoc &L)
Set location information used by debugging information.
Definition IRBuilder.h:228
LLVM_ABI Value * CreateIntrinsic(Intrinsic::ID ID, ArrayRef< Type * > OverloadTypes, ArrayRef< Value * > Args, FMFSource FMFSource={}, const Twine &Name="", ArrayRef< OperandBundleDef > OpBundles={}, function_ref< void(CallInst *)> SetFn=[](CallInst *) {})
Variant to create a possibly constant-folded intrinsic.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition IRBuilder.h:2909
static InstructionCost getInvalid(CostType Val=0)
LLVM_ABI bool hasNoUnsignedWrap() const LLVM_READONLY
Determine whether the no unsigned wrap flag is set.
LLVM_ABI bool hasNoSignedWrap() const LLVM_READONLY
Determine whether the no signed wrap flag is set.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
LLVM_ABI void setAAMetadata(const AAMDNodes &N)
Sets the AA metadata on this instruction from the AAMDNodes structure.
LLVM_ABI bool isAtomic() const LLVM_READONLY
Return true if this instruction has an AtomicOrdering of unordered or higher.
LLVM_ABI void insertBefore(InstListType::iterator InsertPos)
Insert an unlinked instruction into a basic block immediately before the specified position.
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
LLVM_ABI BasicBlock * getSuccessor(unsigned Idx) const LLVM_READONLY
Return the specified successor. This instruction must be a terminator.
iterator_range< user_iterator > users()
LLVM_ABI AAMDNodes getAAMetadata() const
Returns the AA metadata for this instruction.
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
bool isShift() const
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this instruction belongs to.
Class to represent integer types.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition Type.cpp:338
unsigned getBitWidth() const
Get the number of bits in this IntegerType.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:76
This class provides an interface for updating the loop pass manager based on mutations to the loop ne...
An instruction for reading from memory.
unsigned getPointerAddressSpace() const
Returns the address space of the pointer operand.
Value * getPointerOperand()
bool isVolatile() const
Return true if this is a load from a volatile memory location.
bool isUnordered() const
Align getAlign() const
Return the alignment of the access that is being performed.
static LocationSize precise(uint64_t Value)
bool isPrecise() const
static constexpr LocationSize afterPointer()
Any location after the base pointer (but still within the underlying object).
bool contains(const LoopT *L) const
Return true if the specified loop is contained within this loop.
bool isOutermost() const
Return true if the loop does not have a parent (natural) loop.
BlockT * getLoopLatch() const
If there is a single latch block for this loop, return it.
unsigned getNumBlocks() const
Get the number of blocks in this loop in constant time.
unsigned getNumBackEdges() const
Calculate the number of back edges to the loop header.
BlockT * getHeader() const
BlockT * getExitBlock() const
If getExitBlocks would return exactly one block, return that block.
BlockT * getLoopPreheader() const
If there is a preheader for this loop, return it.
ArrayRef< BlockT * > getBlocks() const
Get a list of the basic blocks which make up this loop.
void getUniqueExitBlocks(SmallVectorImpl< BlockT * > &ExitBlocks) const
Return all unique successor blocks of this loop.
block_iterator block_begin() const
BlockT * getUniqueExitBlock() const
If getUniqueExitBlocks would return exactly one block, return that block.
LLVM_ABI PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U)
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
DebugLoc getStartLoc() const
Return the debug location of the start of this loop.
Definition LoopInfo.cpp:694
bool isLoopInvariant(const Value *V) const
Return true if the specified value is loop invariant.
Definition LoopInfo.cpp:68
ICmpInst * getLatchCmpInst() const
Get the latch condition instruction.
Definition LoopInfo.cpp:199
StringRef getName() const
Definition LoopInfo.h:415
PHINode * getCanonicalInductionVariable() const
Check to see if the loop has a canonical induction variable: an integer recurrence that starts at 0 a...
Definition LoopInfo.cpp:175
This class wraps the llvm.memcpy intrinsic.
Value * getLength() const
Value * getDest() const
This is just like getRawDest, but it strips off any cast instructions (including addrspacecast) that ...
MaybeAlign getDestAlign() const
bool isForceInlined() const
bool isVolatile() const
Value * getValue() const
This class wraps the llvm.memset and llvm.memset.inline intrinsics.
MaybeAlign getSourceAlign() const
Value * getSource() const
This is just like getRawSource, but it strips off any cast instructions that feed it,...
Representation for a specific memory location.
An analysis that produces MemorySSA for a function.
Definition MemorySSA.h:917
Encapsulates MemorySSA, including all data associated with memory accesses.
Definition MemorySSA.h:696
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
Diagnostic information for optimization analysis remarks.
The optimization diagnostic interface.
LLVM_ABI void emit(DiagnosticInfoOptimizationBase &OptDiag)
Output the remark via the diagnostic handler and to the optimization record file.
Diagnostic information for missed-optimization remarks.
Diagnostic information for applied optimization remarks.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
Value * getIncomingValueForBlock(const BasicBlock *BB) const
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
int getBasicBlockIndex(const BasicBlock *BB) const
Return the first index of the specified basic block in the value list for this PHI.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
This node represents a polynomial recurrence on the trip count of the specified loop.
bool isAffine() const
Return true if this represents an expression A + B*x where A and B are loop invariant values.
SCEVUse getStepRecurrence(ScalarEvolution &SE) const
Constructs and returns the recurrence indicating how much this expression steps by.
This class represents a constant integer value.
ConstantInt * getValue() const
const APInt & getAPInt() const
Helper to remove instructions inserted during SCEV expansion, unless they are marked as used.
This class uses information about analyze scalars to rewrite expressions in canonical form.
SCEVUse getOperand(unsigned i) const
This class represents an analyzed expression in the program.
LLVM_ABI bool isOne() const
Return true if the expression is a constant one.
static constexpr auto FlagNUW
LLVM_ABI bool isZero() const
Return true if the expression is a constant zero.
LLVM_ABI bool isNonConstantNegative() const
Return true if the specified scev is negated, but not a constant.
Type * getType() const
Return the LLVM type of this SCEV expression.
The main scalar evolution driver.
const DataLayout & getDataLayout() const
Return the DataLayout associated with the module this SCEV instance is operating on.
LLVM_ABI bool isKnownNonNegative(const SCEV *S)
Test if the given expression is known to be non-negative.
LLVM_ABI const SCEV * getBackedgeTakenCount(const Loop *L, ExitCountKind Kind=Exact)
If the specified loop has a predictable backedge-taken count, return it, otherwise return a SCEVCould...
const SCEV * getZero(Type *Ty)
Return a SCEV for the constant 0 of a specific type.
LLVM_ABI const SCEV * getMinusSCEV(SCEVUse LHS, SCEVUse RHS, SCEVFlags Flags=SCEV::FlagNone, unsigned Depth=0)
Return LHS-RHS.
LLVM_ABI const SCEV * getConstant(ConstantInt *V)
LLVM_ABI const SCEV * getSCEV(Value *V)
Return a SCEV expression for the full generality of the specified expression.
LLVM_ABI const SCEV * getTripCountFromExitCount(const SCEV *ExitCount)
A version of getTripCountFromExitCount below which always picks an evaluation type which can not resu...
LLVM_ABI void forgetLoop(const Loop *L)
This method should be called by the client when it has changed a loop in a way that may effect Scalar...
LLVM_ABI bool isLoopInvariant(const SCEV *S, const Loop *L)
Return true if the value of the given SCEV is unchanging in the specified loop.
LLVM_ABI SCEVUse getAddExpr(SmallVectorImpl< SCEVUse > &Ops, SCEVFlagsPair Flags={}, unsigned Depth=0)
Get a canonical add expression, or something simpler if possible.
LLVM_ABI bool isSCEVable(Type *Ty) const
Test if values of the given type are analyzable within the SCEV framework.
LLVM_ABI bool hasLoopInvariantBackedgeTakenCount(const Loop *L)
Return true if the specified loop has an analyzable loop-invariant backedge-taken count.
LLVM_ABI uint32_t getMinTrailingZeros(const SCEV *S, const Instruction *CtxI=nullptr)
Determine the minimum number of zero bits that S is guaranteed to end in (at every loop iteration).
LLVM_ABI SCEVUse getMulExpr(SmallVectorImpl< SCEVUse > &Ops, SCEVFlagsPair Flags={}, unsigned Depth=0)
Get a canonical multiply expression, or something simpler if possible.
LLVM_ABI const SCEV * applyLoopGuards(const SCEV *Expr, const Loop *L)
Try to apply information from loop guards for L to Expr.
LLVM_ABI const SCEV * getTruncateOrZeroExtend(const SCEV *V, Type *Ty, unsigned Depth=0)
Return a SCEV corresponding to a conversion of the input value to the specified type.
LLVM_ABI const SCEV * getNegativeSCEV(const SCEV *V, SCEVFlags Flags=SCEV::FlagNone)
Return the SCEV object corresponding to -V.
LLVM_ABI const SCEV * getTruncateOrSignExtend(const SCEV *V, Type *Ty, unsigned Depth=0)
Return a SCEV corresponding to a conversion of the input value to the specified type.
A vector that has set insertion semantics.
Definition SetVector.h:57
size_type count(const_arg_type key) const
Count the number of elements of a given key in the SetVector.
Definition SetVector.h:268
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:157
Simple and conservative implementation of LoopSafetyInfo that can give false-positive answers to its ...
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
bool erase(PtrType Ptr)
Remove pointer from the set.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
void insert_range(Range &&R)
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
Align getAlign() const
Value * getValueOperand()
Value * getPointerOperand()
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Provides information about what library functions are available for the current target.
unsigned getWCharSize(const Module &M) const
Returns the size of the wchar_t type in bytes.
bool has(LibFunc F) const
Tests whether a library function is available.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
TargetCostKind
The kind of cost model.
@ TCK_SizeAndLatency
The weighted sum of size and latency.
@ TCK_Latency
The latency of instruction.
@ TCC_Basic
The cost of a typical 'add' instruction.
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:48
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
LLVM_ABI unsigned getIntegerBitWidth() const
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Definition Type.cpp:297
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition Type.h:130
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:222
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:296
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
Definition Type.h:186
bool isIntOrPtrTy() const
Return true if this is an integer type or a pointer type.
Definition Type.h:265
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
Definition Type.cpp:303
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
void setOperand(unsigned i, Value *Val)
Definition User.h:212
Value * getOperand(unsigned i) const
Definition User.h:207
unsigned getNumOperands() const
Definition User.h:229
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:257
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:441
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:549
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:260
LLVM_ABI void replaceUsesOutsideBlock(Value *V, BasicBlock *BB)
replaceUsesOutsideBlock - Go through the uses list for this definition and make each use point to "V"...
Definition Value.cpp:607
LLVM_ABI bool replaceUsesWithIf(Value *New, llvm::function_ref< bool(Use &U)> ShouldReplace)
Go through the uses list for this definition and make each use point to "V" if the callback ShouldRep...
Definition Value.cpp:557
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:315
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:396
Value handle that is nullable, but tries to track the Value.
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:201
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:169
const ParentTy * getParent() const
Definition ilist_node.h:34
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Abstract Attribute helper functions.
Definition Attributor.h:164
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
@ HeaderSize
Definition BTF.h:61
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:83
OperandType
Operands are tagged with one of the values of this enum.
Definition MCInstrDesc.h:59
match_combine_and< Ty... > m_CombineAnd(const Ty &...Ps)
Combine pattern matchers matching all of Ps patterns.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
BinaryOp_match< LHS, RHS, Instruction::And, true > m_c_And(const LHS &L, const RHS &R)
Matches an And with LHS and RHS in either order.
bool match(Val *V, const Pattern &P)
match_bind< Instruction > m_Instruction(Instruction *&I)
Match an instruction, capturing it if we match.
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
auto m_BasicBlock()
Match an arbitrary basic block value and ignore it.
auto m_Value()
Match an arbitrary value and ignore it.
is_zero< true > m_Zero()
Match any null constant or a vector with all elements equal to 0.
BinaryOp_match< LHS, RHS, Instruction::Add, true > m_c_Add(const LHS &L, const RHS &R)
Matches a Add with LHS and RHS in either order.
BinaryOp_match< LHS, RHS, Instruction::LShr > m_LShr(const LHS &L, const RHS &R)
CmpClass_match< LHS, RHS, ICmpInst > m_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
BinOpPred_match< LHS, RHS, is_shift_op > m_Shift(const LHS &L, const RHS &R)
Matches shift operations.
BinaryOp_match< LHS, RHS, Instruction::Shl > m_Shl(const LHS &L, const RHS &R)
brc_match< Cond_t, match_bind< BasicBlock >, match_bind< BasicBlock > > m_Br(const Cond_t &C, BasicBlock *&T, BasicBlock *&F)
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
cst_pred_ty< icmp_pred_with_threshold > m_SpecificInt_ICMP(ICmpInst::Predicate Predicate, const APInt &Threshold)
Match an integer or vector with every element comparing 'pred' (eg/ne/...) to Threshold.
bind_cst_ty m_scev_APInt(const APInt *&C)
Match an SCEV constant and bind it to an APInt.
specificloop_ty m_SpecificLoop(const Loop *L)
bool match(const SCEV *S, const Pattern &P)
specificscev_ty m_scev_Specific(const SCEV *S)
Match if we have a specific specified SCEV.
SCEVAffineAddRec_match< Op0_t, Op1_t, match_isa< const Loop > > m_scev_AffineAddRec(const Op0_t &Op0, const Op1_t &Op1)
initializer< Ty > init(const Ty &Val)
LocationClass< Ty > location(Ty &L)
constexpr double e
DiagnosticInfoOptimizationBase::Argument NV
DiagnosticInfoOptimizationBase::setExtraArgs setExtraArgs
bool isSimple(Instruction *I)
Definition SLPUtils.cpp:845
This is an optimization pass for GlobalISel generic memory operations.
static cl::opt< bool, true > DisableLIRPHashRecognize("disable-" DEBUG_TYPE "-hashrecognize", cl::desc("Proceed with loop idiom recognize pass, " "but do not do hash-recognize analysis."), cl::location(DisableLIRP::HashRecognize), cl::init(false), cl::ReallyHidden)
LLVM_ABI bool RecursivelyDeleteTriviallyDeadInstructions(Value *V, const TargetLibraryInfo *TLI=nullptr, MemorySSAUpdater *MSSAU=nullptr, std::function< void(Value *)> AboutToDeleteCallback=std::function< void(Value *)>())
If the specified value is a trivially dead instruction, delete it.
Definition Local.cpp:522
static cl::opt< bool, true > EnableLIRPWcslen("disable-loop-idiom-wcslen", cl::desc("Proceed with loop idiom recognize pass, " "enable conversion of loop(s) to wcslen."), cl::location(DisableLIRP::Wcslen), cl::init(false), cl::ReallyHidden)
InstructionCost Cost
static cl::opt< bool, true > DisableLIRPMemcpy("disable-" DEBUG_TYPE "-memcpy", cl::desc("Proceed with loop idiom recognize pass, but do " "not convert loop(s) to memcpy."), cl::location(DisableLIRP::Memcpy), cl::init(false), cl::ReallyHidden)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
static cl::opt< bool, true > DisableLIRPStrlen("disable-loop-idiom-strlen", cl::desc("Proceed with loop idiom recognize pass, but do " "not convert loop(s) to strlen."), cl::location(DisableLIRP::Strlen), cl::init(false), cl::ReallyHidden)
@ Store
The extracted value is stored (ExtractElement only).
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:649
const ScalarOptions & getScalarOptions(const LLVMContext &C)
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
LLVM_ABI bool isLibFuncEmittable(const Module *M, const TargetLibraryInfo *TLI, LibFunc TheLibFunc)
Check whether the library function is available on target and also that it in the current Module is a...
LLVM_ABI void setBranchWeights(Instruction &I, ArrayRef< uint32_t > Weights, bool IsExpected, bool ElideAllZero=false)
Create a new branch_weights metadata node and add or overwrite a prof metadata reference to instructi...
AnalysisManager< Loop, LoopStandardAnalysisResults & > LoopAnalysisManager
The loop analysis manager.
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
OutputIt transform(R &&Range, OutputIt d_first, UnaryFunction F)
Wrapper function around std::transform to apply a function to a range and store the result elsewhere.
Definition STLExtras.h:2042
LLVM_ABI bool isMustProgress(const Loop *L)
Return true if this loop can be assumed to make progress.
LLVM_ABI bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
bool isModOrRefSet(const ModRefInfo MRI)
Definition ModRef.h:43
LLVM_ABI bool RecursivelyDeleteDeadPHINode(PHINode *PN, const TargetLibraryInfo *TLI=nullptr, MemorySSAUpdater *MSSAU=nullptr, SmallPtrSetImpl< PHINode * > *KnownNonDeadPHIs=nullptr)
If the specified value is an effectively dead PHI node, due to being a def-use chain of single-use no...
Definition Local.cpp:622
LLVM_ABI Value * emitStrLen(Value *Ptr, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the strlen function to the builder, for the specified pointer.
LLVM_ABI bool VerifyMemorySSA
Enables verification of MemorySSA.
Definition MemorySSA.cpp:76
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth, bool MustPreserveProvenance=false)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI bool isKnownNonZero(const Value *V, const SimplifyQuery &Q, unsigned Depth=0)
Return true if the given value is known to be non-zero when defined.
ModRefInfo
Flags indicating whether a memory access modifies or references memory.
Definition ModRef.h:28
@ ModRef
The access may reference and may modify the value stored in memory.
Definition ModRef.h:36
@ Mod
The access may modify the value stored in memory.
Definition ModRef.h:34
TargetTransformInfo TTI
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
LLVM_ABI bool isConsecutiveAccess(Value *A, Value *B, const DataLayout &DL, ScalarEvolution &SE, bool CheckType=true)
Returns true if the memory operations A and B are consecutive.
DWARFExpression::Operation Op
LLVM_ABI bool isGuaranteedNotToBeUndefOrPoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Return true if this function can prove that V does not have undef bits and is never poison.
LLVM_ABI Value * emitWcsLen(Value *Ptr, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the wcslen function to the builder, for the specified pointer.
LLVM_ABI bool extractBranchWeights(const MDNode *ProfileData, SmallVectorImpl< uint32_t > &Weights)
Extract branch weights from MD_prof metadata.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI PreservedAnalyses getLoopPassPreservedAnalyses()
Returns the minimum set of Analyses that all loop passes must preserve.
LLVM_ABI Value * isBytewiseValue(Value *V, const DataLayout &DL)
If the specified value can be set by repeating the same byte in memory, return the i8 value that it i...
static cl::opt< bool, true > DisableLIRPMemset("disable-" DEBUG_TYPE "-memset", cl::desc("Proceed with loop idiom recognize pass, but do " "not convert loop(s) to memset."), cl::location(DisableLIRP::Memset), cl::init(false), cl::ReallyHidden)
unsigned Log2(Align A)
Returns the log2 of the alignment.
Definition Alignment.h:202
static cl::opt< bool, true > DisableLIRPAll("disable-" DEBUG_TYPE "-all", cl::desc("Options to disable Loop Idiom Recognize Pass."), cl::location(DisableLIRP::All), cl::init(false), cl::ReallyHidden)
AAResults AliasAnalysis
Temporary typedef for legacy code that uses a generic AliasAnalysis pointer or reference.
LLVM_ABI bool isKnownNonNegative(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the give value is known to be non-negative.
LLVM_ABI std::optional< DecomposedBitTest > decomposeBitTestICmp(Value *LHS, Value *RHS, CmpInst::Predicate Pred, bool LookThroughTrunc=true, bool AllowNonZeroC=false, bool DecomposeAnd=false)
Decompose an icmp into the form ((X & Mask) pred C) if possible.
SCEVUseT< const SCEV * > SCEVUse
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition Metadata.h:774
LLVM_ABI AAMDNodes merge(const AAMDNodes &Other) const
Given two sets of AAMDNodes applying to potentially different locations, determine the best AAMDNodes...
AAMDNodes extendTo(ssize_t Len) const
Create a new AAMDNode that describes this AAMDNode after extending it to apply to a series of bytes o...
Definition Metadata.h:847
static LLVM_ABI bool Memcpy
When true, Memcpy is disabled.
static LLVM_ABI bool Wcslen
When true, Wcslen is disabled.
static LLVM_ABI bool Strlen
When true, Strlen is disabled.
static LLVM_ABI bool HashRecognize
When true, HashRecognize is disabled.
static LLVM_ABI bool Memset
When true, Memset is disabled.
static LLVM_ABI bool All
When true, the entire pass is disabled.
The adaptor from a function pass to a loop pass computes these analyses and makes them available to t...
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:111
The structure that is returned when a polynomial algorithm was recognized by the analysis.
Match loop-invariant value.
match_LoopInvariant(const SubPattern_t &SP, const Loop *L)