OSDN Git Service

[LoopInterchange] Simplify splitInnerLoopHeader logic (NFC).
authorFlorian Hahn <florian.hahn@arm.com>
Mon, 12 Feb 2018 11:10:58 +0000 (11:10 +0000)
committerFlorian Hahn <florian.hahn@arm.com>
Mon, 12 Feb 2018 11:10:58 +0000 (11:10 +0000)
We can use SplitBlock for both cases, which makes the code slightly
simpler and updates both LoopInfo and the dominator tree.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@324881 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LoopInterchange.cpp

index 4f8dafe..8540f5a 100644 (file)
@@ -1222,17 +1222,12 @@ void LoopInterchangeTransform::splitInnerLoopHeader() {
   // stay in the innerloop body.
   BasicBlock *InnerLoopHeader = InnerLoop->getHeader();
   BasicBlock *InnerLoopPreHeader = InnerLoop->getLoopPreheader();
+  SplitBlock(InnerLoopHeader, InnerLoopHeader->getFirstNonPHI(), DT, LI);
   if (InnerLoopHasReduction) {
-    // Note: The induction PHI must be the first PHI for this to work
-    BasicBlock *New = InnerLoopHeader->splitBasicBlock(
-        ++(InnerLoopHeader->begin()), InnerLoopHeader->getName() + ".split");
-    if (LI)
-      if (Loop *L = LI->getLoopFor(InnerLoopHeader))
-        L->addBasicBlockToLoop(New, *LI);
-
-    // Adjust Reduction PHI's in the block.
+    // Adjust Reduction PHI's in the block. The induction PHI must be the first
+    // PHI in InnerLoopHeader for this to work.
     SmallVector<PHINode *, 8> PHIVec;
-    for (auto I = New->begin(); isa<PHINode>(I); ++I) {
+    for (auto I = std::next(InnerLoopHeader->begin()); isa<PHINode>(I); ++I) {
       PHINode *PHI = dyn_cast<PHINode>(I);
       Value *V = PHI->getIncomingValueForBlock(InnerLoopPreHeader);
       PHI->replaceAllUsesWith(V);
@@ -1241,8 +1236,6 @@ void LoopInterchangeTransform::splitInnerLoopHeader() {
     for (PHINode *P : PHIVec) {
       P->eraseFromParent();
     }
-  } else {
-    SplitBlock(InnerLoopHeader, InnerLoopHeader->getFirstNonPHI(), DT, LI);
   }
 
   DEBUG(dbgs() << "Output of splitInnerLoopHeader InnerLoopHeaderSucc & "