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