[llvm] r369104 - Revert [CodeGen] Do the Simple Early Return in block-placement pass to optimize the blocks

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 16 06:19:29 PDT 2019


Author: fhahn
Date: Fri Aug 16 06:19:29 2019
New Revision: 369104

URL: http://llvm.org/viewvc/llvm-project?rev=369104&view=rev
Log:
Revert [CodeGen] Do the Simple Early Return in block-placement pass to optimize the blocks

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
}

Modified:
    llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp
    llvm/trunk/test/CodeGen/PowerPC/block-placement.mir

Modified: llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp?rev=369104&r1=369103&r2=369104&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp (original)
+++ llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp Fri Aug 16 06:19:29 2019
@@ -2711,7 +2711,6 @@ void MachineBlockPlacement::optimizeBran
   // 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::optimizeBran
         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::runOnMachine
     }
   }
 
-  // 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();
 

Modified: llvm/trunk/test/CodeGen/PowerPC/block-placement.mir
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/block-placement.mir?rev=369104&r1=369103&r2=369104&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/PowerPC/block-placement.mir (original)
+++ llvm/trunk/test/CodeGen/PowerPC/block-placement.mir Fri Aug 16 06:19:29 2019
@@ -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
 ...




More information about the llvm-commits mailing list