summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
118bc24)
way as every other pass. This simplifies the code quite a bit and is
also more idiomatic! <ba-dum!>
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@244853
91177308-0d34-0410-b5e6-
96231b3b80d8
static char ID;
explicit LoopIdiomRecognize() : LoopPass(ID) {
initializeLoopIdiomRecognizePass(*PassRegistry::getPassRegistry());
static char ID;
explicit LoopIdiomRecognize() : LoopPass(ID) {
initializeLoopIdiomRecognizePass(*PassRegistry::getPassRegistry());
- DT = nullptr;
- SE = nullptr;
- TLI = nullptr;
- TTI = nullptr;
}
bool runOnLoop(Loop *L, LPPassManager &LPM) override;
}
bool runOnLoop(Loop *L, LPPassManager &LPM) override;
AU.addRequired<TargetTransformInfoWrapperPass>();
}
AU.addRequired<TargetTransformInfoWrapperPass>();
}
- DominatorTree *getDominatorTree() {
- return DT ? DT
- : (DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree());
- }
-
- ScalarEvolution *getScalarEvolution() {
- return SE ? SE : (SE = &getAnalysis<ScalarEvolution>());
- }
-
- TargetLibraryInfo *getTargetLibraryInfo() {
- if (!TLI)
- TLI = &getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
-
- return TLI;
- }
-
- const TargetTransformInfo *getTargetTransformInfo() {
- return TTI ? TTI
- : (TTI = &getAnalysis<TargetTransformInfoWrapperPass>().getTTI(
- *CurLoop->getHeader()->getParent()));
- }
-
- Loop *getLoop() const { return CurLoop; }
-
private:
/// \name Countable Loop Idiom Handling
/// @{
private:
/// \name Countable Loop Idiom Handling
/// @{
return false;
CurLoop = L;
return false;
CurLoop = L;
// If the loop could not be converted to canonical form, it must have an
// indirectbr in it, just give up.
if (!L->getLoopPreheader())
// If the loop could not be converted to canonical form, it must have an
// indirectbr in it, just give up.
if (!L->getLoopPreheader())
if (Name == "memset" || Name == "memcpy")
return false;
if (Name == "memset" || Name == "memcpy")
return false;
+ DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
SE = &getAnalysis<ScalarEvolution>();
SE = &getAnalysis<ScalarEvolution>();
+ TLI = &getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
+ TTI = &getAnalysis<TargetTransformInfoWrapperPass>().getTTI(
+ *CurLoop->getHeader()->getParent());
+
if (SE->hasLoopInvariantBackedgeTakenCount(L))
return runOnCountableLoop();
if (SE->hasLoopInvariantBackedgeTakenCount(L))
return runOnCountableLoop();
return runOnNoncountableLoop();
}
return runOnNoncountableLoop();
}
if (BECst->getValue()->getValue() == 0)
return false;
if (BECst->getValue()->getValue() == 0)
return false;
- // set DT
- (void)getDominatorTree();
-
LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
- TLI = &getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
-
- // set TLI
- (void)getTargetLibraryInfo();
SmallVector<BasicBlock *, 8> ExitBlocks;
CurLoop->getUniqueExitBlocks(ExitBlocks);
SmallVector<BasicBlock *, 8> ExitBlocks;
CurLoop->getUniqueExitBlocks(ExitBlocks);
/// If detected, transforms the relevant code to issue the popcount intrinsic
/// function call, and returns true; otherwise, returns false.
bool LoopIdiomRecognize::recognizePopcount() {
/// If detected, transforms the relevant code to issue the popcount intrinsic
/// function call, and returns true; otherwise, returns false.
bool LoopIdiomRecognize::recognizePopcount() {
- (void)getScalarEvolution();
- (void)getTargetLibraryInfo();
- (void)getTargetTransformInfo();
-
if (TTI->getPopcntSupport(32) != TargetTransformInfo::PSK_FastHardware)
return false;
if (TTI->getPopcntSupport(32) != TargetTransformInfo::PSK_FastHardware)
return false;