From: Jinsong Ji Date: Tue, 9 Jul 2019 17:53:09 +0000 (+0000) Subject: Revert "[HardwareLoops] NFC - move hardware loop checking code to isHardwareLoopProfi... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7e32df8cbeaee6cce924af594fbc9ff2f98d9869;p=llvm Revert "[HardwareLoops] NFC - move hardware loop checking code to isHardwareLoopProfitable()" This reverts commit d95557306585404893d610784edb3e32f1bfce18. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@365520 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Analysis/TargetTransformInfo.h b/include/llvm/Analysis/TargetTransformInfo.h index 839c84a9c99..af1a12dc18d 100644 --- a/include/llvm/Analysis/TargetTransformInfo.h +++ b/include/llvm/Analysis/TargetTransformInfo.h @@ -99,8 +99,7 @@ struct HardwareLoopInfo { // produces an i1 to guard the loop entry. bool isHardwareLoopCandidate(ScalarEvolution &SE, LoopInfo &LI, DominatorTree &DT, bool ForceNestedLoop = false, - bool ForceHardwareLoopPHI = false, - bool ForceGuardLoopEntry = false); + bool ForceHardwareLoopPHI = false); bool canAnalyze(LoopInfo &LI); }; diff --git a/lib/Analysis/TargetTransformInfo.cpp b/lib/Analysis/TargetTransformInfo.cpp index 23aa4d3a311..50c5ae9c19f 100644 --- a/lib/Analysis/TargetTransformInfo.cpp +++ b/lib/Analysis/TargetTransformInfo.cpp @@ -20,9 +20,6 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/Analysis/CFG.h" #include "llvm/Analysis/LoopIterator.h" -#include "llvm/Transforms/Utils.h" -#include "llvm/Transforms/Utils/LoopUtils.h" -#include "llvm/Analysis/ScalarEvolutionExpander.h" #include using namespace llvm; @@ -58,8 +55,7 @@ bool HardwareLoopInfo::canAnalyze(LoopInfo &LI) { bool HardwareLoopInfo::isHardwareLoopCandidate(ScalarEvolution &SE, LoopInfo &LI, DominatorTree &DT, bool ForceNestedLoop, - bool ForceHardwareLoopPHI, - bool ForceGuardLoopEntry) { + bool ForceHardwareLoopPHI) { SmallVector ExitingBlocks; L->getExitingBlocks(ExitingBlocks); @@ -138,33 +134,6 @@ bool HardwareLoopInfo::isHardwareLoopCandidate(ScalarEvolution &SE, if (!ExitBlock) return false; - - BasicBlock *Preheader = L->getLoopPreheader(); - - // If we don't have a preheader, then insert one. - if (!Preheader) - Preheader = InsertPreheaderForLoop(L, &DT, &LI, nullptr, true); - if (!Preheader) - return false; - - // Make sure we have a valid Loop Count - if (!ExitCount->getType()->isPointerTy() && ExitCount->getType() != CountType) - ExitCount = SE.getZeroExtendExpr(ExitCount, CountType); - - ExitCount = SE.getAddExpr(ExitCount, SE.getOne(CountType)); - - BasicBlock *BB = L->getLoopPreheader(); - - if (ForceGuardLoopEntry && BB->getSinglePredecessor() && - cast(BB->getTerminator())->isUnconditional()) - BB = BB->getSinglePredecessor(); - - if (!isSafeToExpandAt(ExitCount, BB->getTerminator(), SE)) { - LLVM_DEBUG(dbgs() << "Not a Hardware Loop: unsafe to expand ExitCount " - << *ExitCount << "\n"); - return false; - } - return true; } diff --git a/lib/CodeGen/HardwareLoops.cpp b/lib/CodeGen/HardwareLoops.cpp index c1e9604d98b..5f57cabbe86 100644 --- a/lib/CodeGen/HardwareLoops.cpp +++ b/lib/CodeGen/HardwareLoops.cpp @@ -15,6 +15,7 @@ /// //===----------------------------------------------------------------------===// +#include "llvm/Pass.h" #include "llvm/PassRegistry.h" #include "llvm/PassSupport.h" #include "llvm/ADT/Statistic.h" @@ -35,8 +36,10 @@ #include "llvm/IR/Value.h" #include "llvm/Support/Debug.h" #include "llvm/Transforms/Scalar.h" +#include "llvm/Transforms/Utils.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" #include "llvm/Transforms/Utils/Local.h" +#include "llvm/Transforms/Utils/LoopUtils.h" #define DEBUG_TYPE "hardware-loops" @@ -109,6 +112,7 @@ namespace { const DataLayout *DL = nullptr; const TargetTransformInfo *TTI = nullptr; DominatorTree *DT = nullptr; + bool PreserveLCSSA = false; AssumptionCache *AC = nullptr; TargetLibraryInfo *LibInfo = nullptr; Module *M = nullptr; @@ -180,6 +184,7 @@ bool HardwareLoops::runOnFunction(Function &F) { DL = &F.getParent()->getDataLayout(); auto *TLIP = getAnalysisIfAvailable(); LibInfo = TLIP ? &TLIP->getTLI() : nullptr; + PreserveLCSSA = mustPreserveAnalysisID(LCSSAID); AC = &getAnalysis().getAssumptionCache(F); M = F.getParent(); @@ -225,19 +230,25 @@ bool HardwareLoops::TryConvertLoop(Loop *L) { bool HardwareLoops::TryConvertLoop(HardwareLoopInfo &HWLoopInfo) { - LLVM_DEBUG(dbgs() << "HWLoops: Try to convert profitable loop: " - << *HWLoopInfo.L); + Loop *L = HWLoopInfo.L; + LLVM_DEBUG(dbgs() << "HWLoops: Try to convert profitable loop: " << *L); if (!HWLoopInfo.isHardwareLoopCandidate(*SE, *LI, *DT, ForceNestedLoop, - ForceHardwareLoopPHI, - ForceGuardLoopEntry)) + ForceHardwareLoopPHI)) return false; assert( (HWLoopInfo.ExitBlock && HWLoopInfo.ExitBranch && HWLoopInfo.ExitCount) && "Hardware Loop must have set exit info."); - // Now start to converting... + BasicBlock *Preheader = L->getLoopPreheader(); + + // If we don't have a preheader, then insert one. + if (!Preheader) + Preheader = InsertPreheaderForLoop(L, DT, LI, nullptr, PreserveLCSSA); + if (!Preheader) + return false; + HardwareLoop HWLoop(HWLoopInfo, *SE, *DL); HWLoop.Create(); ++NumHWLoops; @@ -246,10 +257,10 @@ bool HardwareLoops::TryConvertLoop(HardwareLoopInfo &HWLoopInfo) { void HardwareLoop::Create() { LLVM_DEBUG(dbgs() << "HWLoops: Converting loop..\n"); - + Value *LoopCountInit = InitLoopCount(); - - assert(LoopCountInit && "Hardware Loop must have a loop count"); + if (!LoopCountInit) + return; InsertIterationSetup(LoopCountInit); @@ -309,22 +320,32 @@ Value *HardwareLoop::InitLoopCount() { // loop counter and tests that is not zero? SCEVExpander SCEVE(SE, DL, "loopcnt"); + if (!ExitCount->getType()->isPointerTy() && + ExitCount->getType() != CountType) + ExitCount = SE.getZeroExtendExpr(ExitCount, CountType); + + ExitCount = SE.getAddExpr(ExitCount, SE.getOne(CountType)); // If we're trying to use the 'test and set' form of the intrinsic, we need // to replace a conditional branch that is controlling entry to the loop. It // is likely (guaranteed?) that the preheader has an unconditional branch to // the loop header, so also check if it has a single predecessor. if (SE.isLoopEntryGuardedByCond(L, ICmpInst::ICMP_NE, ExitCount, - SE.getZero(ExitCount->getType()))) + SE.getZero(ExitCount->getType()))) { + LLVM_DEBUG(dbgs() << " - Attempting to use test.set counter.\n"); UseLoopGuard |= ForceGuardLoopEntry; - else + } else UseLoopGuard = false; BasicBlock *BB = L->getLoopPreheader(); if (UseLoopGuard && BB->getSinglePredecessor() && - cast(BB->getTerminator())->isUnconditional()) { - LLVM_DEBUG(dbgs() << " - Attempting to use test.set counter.\n"); + cast(BB->getTerminator())->isUnconditional()) BB = BB->getSinglePredecessor(); + + if (!isSafeToExpandAt(ExitCount, BB->getTerminator(), SE)) { + LLVM_DEBUG(dbgs() << "- Bailing, unsafe to expand ExitCount " + << *ExitCount << "\n"); + return nullptr; } Value *Count = SCEVE.expandCodeFor(ExitCount, CountType,