diff options
author | Florian Hahn <flo@fhahn.com> | 2019-08-16 13:19:29 +0000 |
---|---|---|
committer | Florian Hahn <flo@fhahn.com> | 2019-08-16 13:19:29 +0000 |
commit | 403e85cbc564be612ab3200ff99377fbba61bd92 (patch) | |
tree | b288d6395f04ad7827b55c28cf84b51c01f175a7 /llvm/lib/CodeGen/MachineBlockPlacement.cpp | |
parent | 9dddd26e31ae9a79008ee99697d52bc565a95411 (diff) | |
download | bcm5719-llvm-403e85cbc564be612ab3200ff99377fbba61bd92.tar.gz bcm5719-llvm-403e85cbc564be612ab3200ff99377fbba61bd92.zip |
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
}
llvm-svn: 369104
Diffstat (limited to 'llvm/lib/CodeGen/MachineBlockPlacement.cpp')
-rw-r--r-- | llvm/lib/CodeGen/MachineBlockPlacement.cpp | 37 |
1 files changed, 0 insertions, 37 deletions
diff --git a/llvm/lib/CodeGen/MachineBlockPlacement.cpp b/llvm/lib/CodeGen/MachineBlockPlacement.cpp index 4e48b810460..641f14d617c 100644 --- a/llvm/lib/CodeGen/MachineBlockPlacement.cpp +++ b/llvm/lib/CodeGen/MachineBlockPlacement.cpp @@ -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(); |