forked from OSchip/llvm-project
[Utils] Clean another duplicated util method.
Summary: Following the cleanup in D48202, method foldBlockIntoPredecessor has the same behavior. Replace its uses with MergeBlockIntoPredecessor. Remove foldBlockIntoPredecessor. Reviewers: chandlerc, dmgreen Subscribers: jlebar, javed.absar, zzheng, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D62751 llvm-svn: 362538
This commit is contained in:
parent
7dcd73340b
commit
bfceed49ce
|
@ -119,9 +119,6 @@ bool computeUnrollCount(Loop *L, const TargetTransformInfo &TTI,
|
|||
TargetTransformInfo::UnrollingPreferences &UP,
|
||||
bool &UseUpperBound);
|
||||
|
||||
BasicBlock *foldBlockIntoPredecessor(BasicBlock *BB, LoopInfo *LI,
|
||||
ScalarEvolution *SE, DominatorTree *DT);
|
||||
|
||||
void remapInstruction(Instruction *I, ValueToValueMapTy &VMap);
|
||||
|
||||
void simplifyLoopAfterUnroll(Loop *L, bool SimplifyIVs, LoopInfo *LI,
|
||||
|
|
|
@ -38,6 +38,8 @@
|
|||
#include "llvm/IR/Value.h"
|
||||
#include "llvm/IR/ValueHandle.h"
|
||||
#include "llvm/Support/Casting.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Transforms/Utils/Local.h"
|
||||
#include <cassert>
|
||||
#include <cstdint>
|
||||
|
@ -47,6 +49,8 @@
|
|||
|
||||
using namespace llvm;
|
||||
|
||||
#define DEBUG_TYPE "basicblock-utils"
|
||||
|
||||
void llvm::DetatchDeadBlocks(
|
||||
ArrayRef<BasicBlock *> BBs,
|
||||
SmallVectorImpl<DominatorTree::UpdateType> *Updates,
|
||||
|
@ -190,6 +194,9 @@ bool llvm::MergeBlockIntoPredecessor(BasicBlock *BB, DomTreeUpdater *DTU,
|
|||
if (IncValue == &PN)
|
||||
return false;
|
||||
|
||||
LLVM_DEBUG(dbgs() << "Merging: " << BB->getName() << " into "
|
||||
<< PredBB->getName() << "\n");
|
||||
|
||||
// Begin by getting rid of unneeded PHIs.
|
||||
SmallVector<AssertingVH<Value>, 4> IncomingValues;
|
||||
if (isa<PHINode>(BB->front())) {
|
||||
|
|
|
@ -93,66 +93,6 @@ void llvm::remapInstruction(Instruction *I, ValueToValueMapTy &VMap) {
|
|||
}
|
||||
}
|
||||
|
||||
/// Folds a basic block into its predecessor if it only has one predecessor, and
|
||||
/// that predecessor only has one successor.
|
||||
/// The LoopInfo Analysis that is passed will be kept consistent.
|
||||
BasicBlock *llvm::foldBlockIntoPredecessor(BasicBlock *BB, LoopInfo *LI,
|
||||
ScalarEvolution *SE,
|
||||
DominatorTree *DT) {
|
||||
// Merge basic blocks into their predecessor if there is only one distinct
|
||||
// pred, and if there is only one distinct successor of the predecessor, and
|
||||
// if there are no PHI nodes.
|
||||
BasicBlock *OnlyPred = BB->getSinglePredecessor();
|
||||
if (!OnlyPred) return nullptr;
|
||||
|
||||
if (OnlyPred->getTerminator()->getNumSuccessors() != 1)
|
||||
return nullptr;
|
||||
|
||||
LLVM_DEBUG(dbgs() << "Merging: " << BB->getName() << " into "
|
||||
<< OnlyPred->getName() << "\n");
|
||||
|
||||
// Resolve any PHI nodes at the start of the block. They are all
|
||||
// guaranteed to have exactly one entry if they exist, unless there are
|
||||
// multiple duplicate (but guaranteed to be equal) entries for the
|
||||
// incoming edges. This occurs when there are multiple edges from
|
||||
// OnlyPred to OnlySucc.
|
||||
FoldSingleEntryPHINodes(BB);
|
||||
|
||||
// Delete the unconditional branch from the predecessor...
|
||||
OnlyPred->getInstList().pop_back();
|
||||
|
||||
// Make all PHI nodes that referred to BB now refer to Pred as their
|
||||
// source...
|
||||
BB->replaceAllUsesWith(OnlyPred);
|
||||
|
||||
// Move all definitions in the successor to the predecessor...
|
||||
OnlyPred->getInstList().splice(OnlyPred->end(), BB->getInstList());
|
||||
|
||||
// OldName will be valid until erased.
|
||||
StringRef OldName = BB->getName();
|
||||
|
||||
// Erase the old block and update dominator info.
|
||||
if (DT)
|
||||
if (DomTreeNode *DTN = DT->getNode(BB)) {
|
||||
DomTreeNode *PredDTN = DT->getNode(OnlyPred);
|
||||
SmallVector<DomTreeNode *, 8> Children(DTN->begin(), DTN->end());
|
||||
for (auto *DI : Children)
|
||||
DT->changeImmediateDominator(DI, PredDTN);
|
||||
|
||||
DT->eraseNode(BB);
|
||||
}
|
||||
|
||||
LI->removeBlock(BB);
|
||||
|
||||
// Inherit predecessor's name if it exists...
|
||||
if (!OldName.empty() && !OnlyPred->hasName())
|
||||
OnlyPred->setName(OldName);
|
||||
|
||||
BB->eraseFromParent();
|
||||
|
||||
return OnlyPred;
|
||||
}
|
||||
|
||||
/// Check if unrolling created a situation where we need to insert phi nodes to
|
||||
/// preserve LCSSA form.
|
||||
/// \param Blocks is a vector of basic blocks representing unrolled loop.
|
||||
|
@ -818,12 +758,14 @@ LoopUnrollResult llvm::UnrollLoop(Loop *L, UnrollLoopOptions ULO, LoopInfo *LI,
|
|||
assert(!DT || !UnrollVerifyDomtree ||
|
||||
DT->verify(DominatorTree::VerificationLevel::Fast));
|
||||
|
||||
DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Eager);
|
||||
// Merge adjacent basic blocks, if possible.
|
||||
for (BasicBlock *Latch : Latches) {
|
||||
BranchInst *Term = cast<BranchInst>(Latch->getTerminator());
|
||||
if (Term->isUnconditional()) {
|
||||
BasicBlock *Dest = Term->getSuccessor(0);
|
||||
if (BasicBlock *Fold = foldBlockIntoPredecessor(Dest, LI, SE, DT)) {
|
||||
BasicBlock *Fold = Dest->getUniquePredecessor();
|
||||
if (MergeBlockIntoPredecessor(Dest, &DTU, LI)) {
|
||||
// Dest has been folded into Fold. Update our worklists accordingly.
|
||||
std::replace(Latches.begin(), Latches.end(), Dest, Fold);
|
||||
UnrolledLoopBlocks.erase(std::remove(UnrolledLoopBlocks.begin(),
|
||||
|
|
|
@ -538,12 +538,14 @@ LoopUnrollResult llvm::UnrollAndJamLoop(
|
|||
MergeBlocks.insert(ForeBlocksLast.begin(), ForeBlocksLast.end());
|
||||
MergeBlocks.insert(SubLoopBlocksLast.begin(), SubLoopBlocksLast.end());
|
||||
MergeBlocks.insert(AftBlocksLast.begin(), AftBlocksLast.end());
|
||||
DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Eager);
|
||||
while (!MergeBlocks.empty()) {
|
||||
BasicBlock *BB = *MergeBlocks.begin();
|
||||
BranchInst *Term = dyn_cast<BranchInst>(BB->getTerminator());
|
||||
if (Term && Term->isUnconditional() && L->contains(Term->getSuccessor(0))) {
|
||||
BasicBlock *Dest = Term->getSuccessor(0);
|
||||
if (BasicBlock *Fold = foldBlockIntoPredecessor(Dest, LI, SE, DT)) {
|
||||
BasicBlock *Fold = Dest->getUniquePredecessor();
|
||||
if (MergeBlockIntoPredecessor(Dest, &DTU, LI)) {
|
||||
// Don't remove BB and add Fold as they are the same BB
|
||||
assert(Fold == BB);
|
||||
(void)Fold;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
; REQUIRES: asserts
|
||||
; RUN: opt -mcpu=thunderx2t99 -loop-unroll --debug-only=loop-unroll -S -unroll-allow-partial < %s 2>&1 | FileCheck %s
|
||||
; RUN: opt -mcpu=thunderx2t99 -loop-unroll --debug-only=loop-unroll --debug-only=basicblock-utils -S -unroll-allow-partial < %s 2>&1 | FileCheck %s
|
||||
|
||||
target triple = "aarch64-unknown-linux-gnu"
|
||||
|
||||
|
|
Loading…
Reference in New Issue