MachineBasicBlock *NextBB = &*I;
if (TBB == NextBB && !Cond.empty() && !FBB) {
if (!TII->ReverseBranchCondition(Cond)) {
+ // XXX-disabled: Don't fold conditional branches that we added
+ // intentionally.
+ MachineBasicBlock::iterator I = CurMBB->getLastNonDebugInstr();
+ if (I != CurMBB->end()) {
+ if (I->isConditionalBranch()) {
+ return;
+ }
+ }
+
TII->RemoveBranch(*CurMBB);
TII->InsertBranch(*CurMBB, SuccBB, nullptr, Cond, dl);
return;
goto ReoptimizeBlock;
}
- /*
// If the previous block unconditionally falls through to this block and
// this block has no other predecessors, move the contents of this block
// into the prior block. This doesn't usually happen when SimplifyCFG
MadeChange = true;
return MadeChange;
}
- */
// If the previous branch *only* branches to *this* block (conditional or
// not) remove the branch.
// If the prior block branches somewhere else on the condition and here if
// the condition is false, remove the uncond second branch.
if (PriorFBB == MBB) {
+ // XXX-disabled: Don't fold conditional branches that we added
+ // intentionally.
+ MachineBasicBlock::iterator I = PrevBB.getLastNonDebugInstr();
+ if (I != PrevBB.end()) {
+ if (I->isConditionalBranch()) {
+ return MadeChange ;
+ }
+ }
+
DebugLoc dl = getBranchDebugLoc(PrevBB);
TII->RemoveBranch(PrevBB);
TII->InsertBranch(PrevBB, PriorTBB, nullptr, PriorCond, dl);
// if the branch condition is reversible, reverse the branch to create a
// fall-through.
if (PriorTBB == MBB) {
+ // XXX-disabled: Don't fold conditional branches that we added
+ // intentionally.
+ MachineBasicBlock::iterator I = PrevBB.getLastNonDebugInstr();
+ if (I != PrevBB.end()) {
+ if (I->isConditionalBranch()) {
+ return MadeChange ;
+ }
+ }
+
SmallVector<MachineOperand, 4> NewPriorCond(PriorCond);
if (!TII->ReverseBranchCondition(NewPriorCond)) {
DebugLoc dl = getBranchDebugLoc(PrevBB);
return false;
}
+// XXX-update: Returns whether we can remove a conditional branch instruction.
+// If it's one that is mannually added by us, then don't remove it (return
+// false). All their successors are the same.
+static bool shouldRemoveConditionalBranch(MachineInstr* I) {
+ auto* MBB = I->getParent();
+ assert(isCondBranchOpcode(I->getOpcode()));
+ bool SameSuccessor = true;
+ MachineBasicBlock* BB = nullptr;
+ for (auto* Succ : MBB->successors()) {
+ if (!BB) {
+ BB = Succ;
+ }
+ if (BB != Succ) {
+ SameSuccessor = false;
+ }
+ }
+ return !SameSuccessor;
+}
+
unsigned AArch64InstrInfo::RemoveBranch(MachineBasicBlock &MBB) const {
MachineBasicBlock::iterator I = MBB.getLastNonDebugInstr();
if (I == MBB.end())
!isCondBranchOpcode(I->getOpcode()))
return 0;
+ // XXX-update: Don't remove fake conditional branches.
+ if (isCondBranchOpcode(I->getOpcode()) && !shouldRemoveConditionalBranch(I)) {
+ return 0;
+ }
+
// Remove the branch.
I->eraseFromParent();
if (!isCondBranchOpcode(I->getOpcode()))
return 1;
+ // XXX-update: Don't remove fake conditional branches.
+ if (!shouldRemoveConditionalBranch(I)) {
+ return 1;
+ }
+
// Remove the branch.
I->eraseFromParent();
return 2;