Revert [CodeGen] Do the Simple Early Return in block-placement pass to optimize the...
authorFlorian Hahn <flo@fhahn.com>
Fri, 16 Aug 2019 13:19:29 +0000 (13:19 +0000)
committerFlorian Hahn <flo@fhahn.com>
Fri, 16 Aug 2019 13:19:29 +0000 (13:19 +0000)
This reverts r368997 (git commit 2a903c0b679bae1919f9fc01f78e4bc6cff2add0)

It looks like this commit adds invalid predecessors to MBBs. The example
below fails the verifier after MachineBlockPlacement (run llc
-verify-machineinstrs):

@global.4 = external constant i8*

declare i32 @zot(...)

define i16* @snork.67() personality i8* bitcast (i32 (...)* @zot to i8*) {
bb:
  invoke void undef()
          to label %bb5 unwind label %bb4

bb4:                                              ; preds = %bb
  %tmp = landingpad { i8*, i32 }
          catch i8* null
  unreachable

bb5:                                              ; preds = %bb
  %tmp6 = load i32, i32* null, align 4
  %tmp7 = icmp eq i32 %tmp6, 0
  br i1 %tmp7, label %bb14, label %bb8

bb8:                                              ; preds = %bb11, %bb5
  invoke void undef()
          to label %bb9 unwind label %bb11

bb9:                                              ; preds = %bb8
  %tmp10 = invoke i16* undef()
          to label %bb14 unwind label %bb11

bb11:                                             ; preds = %bb9, %bb8
  %tmp12 = landingpad { i8*, i32 }
          cleanup
          catch i8* bitcast (i8** @global.4 to i8*)
  %tmp13 = icmp ult i64 undef, undef
  br i1 %tmp13, label %bb8, label %bb14

bb14:                                             ; preds = %bb11, %bb9, %bb5
  %tmp15 = phi i16* [ null, %bb5 ], [ null, %bb11 ], [ %tmp10, %bb9 ]
  ret i16* %tmp15
}

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

lib/CodeGen/MachineBlockPlacement.cpp
test/CodeGen/PowerPC/block-placement.mir

index 4e48b810460b3c9f232e2d3ee434d00094d227c5..641f14d617c7903b9cd2699bbd1afe0205d1f234 100644 (file)
@@ -2711,7 +2711,6 @@ void MachineBlockPlacement::optimizeBranches() {
   // cannot because all branches may not be analyzable.
   // E.g., the target may be able to remove an unconditional branch to
   // a fallthrough when it occurs after predicated terminators.
-  SmallVector<MachineBasicBlock*, 4> EmptyBB;
   for (MachineBasicBlock *ChainBB : FunctionChain) {
     Cond.clear();
     MachineBasicBlock *TBB = nullptr, *FBB = nullptr; // For AnalyzeBranch.
@@ -2731,42 +2730,9 @@ void MachineBlockPlacement::optimizeBranches() {
         TII->removeBranch(*ChainBB);
         TII->insertBranch(*ChainBB, FBB, TBB, Cond, dl);
         ChainBB->updateTerminator();
-      } else if (Cond.empty() && TBB && ChainBB != TBB && !TBB->empty() &&
-                 !TBB->canFallThrough()) {
-        // When ChainBB is unconditional branch to the TBB, and TBB has no
-        // fallthrough predecessor and fallthrough successor, try to merge
-        // ChainBB and TBB. This is legal under the one of following conditions:
-        // 1. ChainBB is empty except for an unconditional branch.
-        // 2. TBB has only one predecessor.
-        MachineFunction::iterator I(TBB);
-        if (((TBB == &*F->begin()) || !std::prev(I)->canFallThrough()) &&
-             (TailDup.isSimpleBB(ChainBB) || (TBB->pred_size() == 1))) {
-          TII->removeBranch(*ChainBB);
-          ChainBB->removeSuccessor(TBB);
-
-          // Update the CFG.
-          while (!TBB->pred_empty()) {
-            MachineBasicBlock *Pred = *(TBB->pred_end() - 1);
-            Pred->ReplaceUsesOfBlockWith(TBB, ChainBB);
-          }
-
-          for (MachineBasicBlock *Succ : TBB->successors())
-            ChainBB->addSuccessor(Succ, MBPI->getEdgeProbability(TBB, Succ));
-
-          // Move all the instructions of TBB to ChainBB.
-          ChainBB->splice(ChainBB->end(), TBB, TBB->begin(), TBB->end());
-          EmptyBB.push_back(TBB);
-        }
       }
     }
   }
-
-  for (auto BB: EmptyBB) {
-    MLI->removeBlock(BB);
-    FunctionChain.remove(BB);
-    BlockToChain.erase(BB);
-    F->erase(BB);
-  }
 }
 
 void MachineBlockPlacement::alignBlocks() {
@@ -3086,9 +3052,6 @@ bool MachineBlockPlacement::runOnMachineFunction(MachineFunction &MF) {
     }
   }
 
-  // optimizeBranches() may change the blocks, but we haven't updated the
-  // post-dominator tree. Because the post-dominator tree won't be used after
-  // this function and this pass don't preserve the post-dominator tree.
   optimizeBranches();
   alignBlocks();
 
index e413e3db2d5d019083730d402504ee970b3c5b7f..9406e13b354ebdc62a542ea54df7557de371b345 100644 (file)
@@ -209,10 +209,14 @@ body:             |
     BLR8 implicit $lr8, implicit $rm, implicit killed $x3
 
   ; CHECK:      bb.5.if.else.i:
-  ; CHECK-NEXT:   renamable $x3 = LI8 1
-  ; CHECK-NEXT:   BLR8 implicit $lr8, implicit $rm, implicit killed $x3
+  ; CHECK:        successors: %bb.11(0x80000000)
+  ; CHECK:        B %bb.11
 
   ; CHECK:      bb.8.while.body.i (align 4):
-  ; CHECK:        successors: %bb.5(0x04000000), %bb.9(0x7c000000)
-  ; CHECK:        BCC 76, killed renamable $cr0, %bb.5
+  ; CHECK:        successors: %bb.11(0x04000000), %bb.9(0x7c000000)
+  ; CHECK:        BCC 76, killed renamable $cr0, %bb.11
+
+  ; CHECK:      bb.11:
+  ; CHECK:        renamable $x3 = LI8 1
+  ; CHECK-NEXT:   BLR8 implicit $lr8, implicit $rm, implicit killed $x3
 ...