Index: llvm/test/tools/llvm-reduce/mir/reduce-blocks-g_br.mir =================================================================== --- llvm/test/tools/llvm-reduce/mir/reduce-blocks-g_br.mir +++ llvm/test/tools/llvm-reduce/mir/reduce-blocks-g_br.mir @@ -12,17 +12,20 @@ # RESULT0-NEXT: %1:_(s32) = G_CONSTANT i32 0 # RESULT0-NEXT: %2:_(s32) = G_ICMP intpred(ugt), %0(s32), %1 # RESULT0-NEXT: S_NOP 0 -# RESULT0-NEXT: G_BRCOND %2(s32), %bb.[[UNDEF_BB:[0-9]+]] +# RESULT0-NEXT: %3:_(s1) = G_IMPLICIT_DEF # RESULT0-NEXT: G_BR %bb.1 # RESULT0: bb.1: # RESULT0-NEXT: S_NOP 1 -# RESULT0-NEXT: G_BRCOND %2(s32), %bb.[[UNDEF_BB]] -# RESULT0-NEXT: G_BR %bb.[[UNDEF_BB]] +# RESULT0-NEXT: G_BR %bb.[[UNDEF_BB:[0-9]+]] -# RESULT0: bb.4: +# RESULT0-NOT: bb. + +# RESULT0: bb.5: # RESULT0-NEXT: S_ENDPGM 0 +# RESULT0-NOT: bb. + # RESULT0: bb.[[UNDEF_BB]]: --- @@ -50,9 +53,15 @@ G_BR %bb.3 bb.3: + ; Conditional fallthrough S_NOP 3 + %4:_(s1) = G_IMPLICIT_DEF + G_BRCOND %4, %bb.5 bb.4: + S_NOP 3 + + bb.5: S_ENDPGM 0 ... Index: llvm/test/tools/llvm-reduce/mir/reduce-blocks-g_brjt.mir =================================================================== --- llvm/test/tools/llvm-reduce/mir/reduce-blocks-g_brjt.mir +++ llvm/test/tools/llvm-reduce/mir/reduce-blocks-g_brjt.mir @@ -24,7 +24,7 @@ # RESULT0-NEXT: %10:_(s1) = G_IMPLICIT_DEF # RESULT0-NEXT: %5:_(s32) = G_IMPLICIT_DEF # RESULT0-NEXT: %17:_(s32) = G_IMPLICIT_DEF -# RESULT0-NEXT: G_BRCOND %10(s1), %bb.[[UNDEF_BB:[0-9]+]] +# RESULT0-NEXT: G_BR %bb.1 # RESULT0: bb.1.entry: # RESULT0-NEXT: S_NOP 1 @@ -35,7 +35,7 @@ # RESULT0-NEXT: %15:_(s32) = G_IMPLICIT_DEF # RESULT0-NEXT: G_BRJT %12(p0), %jump-table.0, %7(s64) -# RESULT0: bb.[[UNDEF_BB]]: +# RESULT0-NOT: bb. # RESULT1: bb.0.entry: Index: llvm/tools/llvm-reduce/deltas/ReduceBlocksMIR.cpp =================================================================== --- llvm/tools/llvm-reduce/deltas/ReduceBlocksMIR.cpp +++ llvm/tools/llvm-reduce/deltas/ReduceBlocksMIR.cpp @@ -26,6 +26,46 @@ using BlockSet = DenseSet; +// Analyze the successors for a block using GlobalISel's generic branch +// instructions, G_BR and G_BRCOND. +static bool analyzeBranchGeneric(const MachineBasicBlock &MBB, + MachineBasicBlock *&TrueMBB, + MachineBasicBlock *&FalseMBB, + SmallVectorImpl &Cond) { + MachineBasicBlock::const_iterator I = MBB.getFirstTerminator(); + if (I == MBB.end()) + return false; + + if (I->getOpcode() == TargetOpcode::G_BR) { + TrueMBB = I->getOperand(0).getMBB(); + return false; + } + + if (I->getOpcode() != TargetOpcode::G_BRCOND) + return true; + + Cond.push_back(I->getOperand(0)); + TrueMBB = I->getOperand(1).getMBB(); + ++I; + if (I == MBB.end()) + return false; + + if (I->getOpcode() != TargetOpcode::G_BR) + return true; + + FalseMBB = I->getOperand(0).getMBB(); + return false; +} + +static void removeBranchGeneric(MachineBasicBlock &MBB) { + for (MachineInstr &MI : make_early_inc_range(MBB.terminators())) { + assert(MI.getOpcode() == TargetOpcode::G_BR || + MI.getOpcode() == TargetOpcode::G_BRCOND); + if (MI.isBranch()) + MI.eraseFromParent(); + } +} + static bool isPseudoUndefBlock(const MachineBasicBlock &MBB) { return MBB.empty() && &MBB == &MBB.getParent()->back() && MBB.succ_empty(); } @@ -82,10 +122,24 @@ if (&MBB != EntryBB && BBsToDelete.count(&MBB)) return; + enum BranchType { + UnknownBranching, + TargetBranching, + GenericBranching + } BranchType = UnknownBranching; + MachineBasicBlock *TBB = nullptr; MachineBasicBlock *FBB = nullptr; SmallVector Cond; + if (TII.analyzeBranch(MBB, TBB, FBB, Cond)) { + TBB = FBB = nullptr; + if (!analyzeBranchGeneric(MBB, TBB, FBB, Cond)) + BranchType = GenericBranching; + } else + BranchType = TargetBranching; + + if (BranchType == UnknownBranching) { // If we don't understand this branch, replace deleted block references with // the dummy undef block. bool UsedUndefBlock = false; @@ -109,7 +163,10 @@ } // If we can analyze this branch, insert simplified terminators. - TII.removeBranch(MBB); + if (BranchType == GenericBranching) + removeBranchGeneric(MBB); + else + TII.removeBranch(MBB); MachineBasicBlock *NewSucc; if (MBB.succ_empty()) { @@ -124,7 +181,12 @@ NewSucc = *MBB.succ_begin(); } - TII.insertUnconditionalBranch(MBB, NewSucc, DebugLoc()); + if (BranchType == GenericBranching) { + BuildMI(&MBB, DebugLoc(), TII.get(TargetOpcode::G_BR)) + .addMBB(NewSucc); + } else { + TII.insertUnconditionalBranch(MBB, NewSucc, DebugLoc()); + } } static unsigned getImpDefOpcode(const MachineRegisterInfo &MRI, Register Reg) {