diff options
author | Whitney Tsang <whitneyt@ca.ibm.com> | 2021-01-04 19:57:44 +0000 |
---|---|---|
committer | Whitney Tsang <whitneyt@ca.ibm.com> | 2021-01-04 19:59:50 +0000 |
commit | 9a17bff4f715a9f3ec89f4eacae8fdea1b74fe79 (patch) | |
tree | eecf1e3f97f8b9d12b6d6edafb51318b4666f4ce /llvm/lib/Transforms/Utils/BasicBlockUtils.cpp | |
parent | e1833e7493aede34aaf9c1a4480848d60dad7f1d (diff) | |
download | llvm-9a17bff4f715a9f3ec89f4eacae8fdea1b74fe79.zip llvm-9a17bff4f715a9f3ec89f4eacae8fdea1b74fe79.tar.gz llvm-9a17bff4f715a9f3ec89f4eacae8fdea1b74fe79.tar.bz2 |
[LoopNest] Allow empty basic blocks without loops
Allow loop nests with empty basic blocks without loops in different
levels as perfect.
Reviewers: Meinersbur
Differential Revision: https://reviews.llvm.org/D93665
Diffstat (limited to 'llvm/lib/Transforms/Utils/BasicBlockUtils.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/BasicBlockUtils.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp index 5b8bc18..1b89ebe 100644 --- a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp +++ b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp @@ -494,6 +494,31 @@ void llvm::ReplaceInstWithInst(Instruction *From, Instruction *To) { ReplaceInstWithInst(From->getParent()->getInstList(), BI, To); } +const BasicBlock &llvm::skipEmptyBlockUntil(const BasicBlock *From, + const BasicBlock *End) { + assert(From && "Expecting valid From"); + assert(End && "Expecting valid End"); + + if (From == End || !From->getSingleSuccessor()) + return *From; + + auto IsEmpty = [](const BasicBlock *BB) { + return (BB->getInstList().size() == 1); + }; + + // Visited is used to avoid running into an infinite loop. + SmallPtrSet<const BasicBlock *, 4> Visited; + const BasicBlock *BB = From->getSingleSuccessor(); + const BasicBlock *PredBB = BB; + while (BB && BB != End && IsEmpty(BB) && !Visited.count(BB)) { + Visited.insert(BB); + PredBB = BB; + BB = BB->getSingleSuccessor(); + } + + return (BB == End) ? *End : *PredBB; +} + BasicBlock *llvm::SplitEdge(BasicBlock *BB, BasicBlock *Succ, DominatorTree *DT, LoopInfo *LI, MemorySSAUpdater *MSSAU) { unsigned SuccNum = GetSuccessorNumber(BB, Succ); |