forked from OSchip/llvm-project
[LoopInterchange] Move preheader creation to transform stage and simplify.
There is no need to create preheaders in the analysis stage, we only need them when adjusting the branches. Also, the only cases we need to create our own preheaders is when they have more than 1 predecessors or PHI nodes (even with only 1 predecessor, we could have an LCSSA phi node). I have simplified the conditions and added some assertions to be sure. Because we know the inner and outer loop need to be tightly nested, it is sufficient to check if the inner loop preheader is the outer loop header to check if we need to create a new preheader. Reviewers: efriedma, mcrosier, karthikthecool Reviewed By: efriedma Differential Revision: https://reviews.llvm.org/D51703 llvm-svn: 341533
This commit is contained in:
parent
20c88ebf57
commit
236f6feb8f
|
@ -663,7 +663,8 @@ bool LoopInterchangeLegality::tightlyNested(Loop *OuterLoop, Loop *InnerLoop) {
|
|||
return false;
|
||||
|
||||
for (BasicBlock *Succ : successors(OuterLoopHeaderBI))
|
||||
if (Succ != InnerLoopPreHeader && Succ != OuterLoopLatch)
|
||||
if (Succ != InnerLoopPreHeader && Succ != InnerLoop->getHeader() &&
|
||||
Succ != OuterLoopLatch)
|
||||
return false;
|
||||
|
||||
LLVM_DEBUG(dbgs() << "Checking instructions in Loop header and Loop latch\n");
|
||||
|
@ -1016,28 +1017,6 @@ bool LoopInterchangeLegality::canInterchangeLoops(unsigned InnerLoopId,
|
|||
return false;
|
||||
}
|
||||
|
||||
// Create unique Preheaders if we already do not have one.
|
||||
BasicBlock *OuterLoopPreHeader = OuterLoop->getLoopPreheader();
|
||||
BasicBlock *InnerLoopPreHeader = InnerLoop->getLoopPreheader();
|
||||
|
||||
// Create a unique outer preheader -
|
||||
// 1) If OuterLoop preheader is not present.
|
||||
// 2) If OuterLoop Preheader is same as OuterLoop Header
|
||||
// 3) If OuterLoop Preheader is same as Header of the previous loop.
|
||||
// 4) If OuterLoop Preheader is Entry node.
|
||||
if (!OuterLoopPreHeader || OuterLoopPreHeader == OuterLoop->getHeader() ||
|
||||
isa<PHINode>(OuterLoopPreHeader->begin()) ||
|
||||
!OuterLoopPreHeader->getUniquePredecessor()) {
|
||||
OuterLoopPreHeader =
|
||||
InsertPreheaderForLoop(OuterLoop, DT, LI, PreserveLCSSA);
|
||||
}
|
||||
|
||||
if (!InnerLoopPreHeader || InnerLoopPreHeader == InnerLoop->getHeader() ||
|
||||
InnerLoopPreHeader == OuterLoop->getHeader()) {
|
||||
InnerLoopPreHeader =
|
||||
InsertPreheaderForLoop(InnerLoop, DT, LI, PreserveLCSSA);
|
||||
}
|
||||
|
||||
// TODO: The loops could not be interchanged due to current limitations in the
|
||||
// transform module.
|
||||
if (currentLimitations()) {
|
||||
|
@ -1356,13 +1335,27 @@ bool LoopInterchangeTransform::adjustLoopBranches() {
|
|||
LLVM_DEBUG(dbgs() << "adjustLoopBranches called\n");
|
||||
std::vector<DominatorTree::UpdateType> DTUpdates;
|
||||
|
||||
BasicBlock *OuterLoopPreHeader = OuterLoop->getLoopPreheader();
|
||||
BasicBlock *InnerLoopPreHeader = InnerLoop->getLoopPreheader();
|
||||
|
||||
assert(OuterLoopPreHeader != OuterLoop->getHeader() &&
|
||||
InnerLoopPreHeader != InnerLoop->getHeader() && OuterLoopPreHeader &&
|
||||
InnerLoopPreHeader && "Guaranteed by loop-simplify form");
|
||||
// Ensure that both preheaders do not contain PHI nodes and have single
|
||||
// predecessors. This allows us to move them easily. We use
|
||||
// InsertPreHeaderForLoop to create an 'extra' preheader, if the existing
|
||||
// preheaders do not satisfy those conditions.
|
||||
if (isa<PHINode>(OuterLoopPreHeader->begin()) ||
|
||||
!OuterLoopPreHeader->getUniquePredecessor())
|
||||
OuterLoopPreHeader = InsertPreheaderForLoop(OuterLoop, DT, LI, true);
|
||||
if (InnerLoopPreHeader == OuterLoop->getHeader())
|
||||
InnerLoopPreHeader = InsertPreheaderForLoop(InnerLoop, DT, LI, true);
|
||||
|
||||
// Adjust the loop preheader
|
||||
BasicBlock *InnerLoopHeader = InnerLoop->getHeader();
|
||||
BasicBlock *OuterLoopHeader = OuterLoop->getHeader();
|
||||
BasicBlock *InnerLoopLatch = InnerLoop->getLoopLatch();
|
||||
BasicBlock *OuterLoopLatch = OuterLoop->getLoopLatch();
|
||||
BasicBlock *OuterLoopPreHeader = OuterLoop->getLoopPreheader();
|
||||
BasicBlock *InnerLoopPreHeader = InnerLoop->getLoopPreheader();
|
||||
BasicBlock *OuterLoopPredecessor = OuterLoopPreHeader->getUniquePredecessor();
|
||||
BasicBlock *InnerLoopLatchPredecessor =
|
||||
InnerLoopLatch->getUniquePredecessor();
|
||||
|
|
Loading…
Reference in New Issue