/// isBlockOnlyReachableByFallthough - Return true if the basic block has /// exactly one predecessor and the control transfer mechanism between /// the predecessor and this block is a fall-through. /// /// This overrides AsmPrinter's implementation to handle delay slots. bool SparcAsmPrinter:: isBlockOnlyReachableByFallthrough(const MachineBasicBlock *MBB) const { // If this is a landing pad, it isn't a fall through. If it has no preds, // then nothing falls through to it. if (MBB->isLandingPad() || MBB->pred_empty()) return false; // If there isn't exactly one predecessor, it can't be a fall through. MachineBasicBlock::const_pred_iterator PI = MBB->pred_begin(), PI2 = PI; ++PI2; if (PI2 != MBB->pred_end()) return false; // The predecessor has to be immediately before this block. const MachineBasicBlock *Pred = *PI; if (!Pred->isLayoutSuccessor(MBB)) return false; // Check if the last terminator is an unconditional branch. MachineBasicBlock::const_iterator I = Pred->end(); while (I != Pred->begin() && !(--I)->isTerminator()) ; // Noop return I == Pred->end() || !I->isBarrier(); }
// KLUDGE: HexagonInstrInfo::AnalyzeBranch may be unable to recognize // that a block can never fall-through. bool HexagonEarlyIfConversion::hasUncondBranch(const MachineBasicBlock *B) const { MachineBasicBlock::const_iterator I = B->getFirstTerminator(), E = B->end(); while (I != E) { if (I->isBarrier()) return true; ++I; } return false; }
void llvm::guessSuccessors(const MachineBasicBlock &MBB, SmallVectorImpl<MachineBasicBlock*> &Result, bool &IsFallthrough) { SmallPtrSet<MachineBasicBlock*,8> Seen; for (const MachineInstr &MI : MBB) { if (MI.isPHI()) continue; for (const MachineOperand &MO : MI.operands()) { if (!MO.isMBB()) continue; MachineBasicBlock *Succ = MO.getMBB(); auto RP = Seen.insert(Succ); if (RP.second) Result.push_back(Succ); } } MachineBasicBlock::const_iterator I = MBB.getLastNonDebugInstr(); IsFallthrough = I == MBB.end() || !I->isBarrier(); }
bool PatmosAsmPrinter:: isBlockOnlyReachableByFallthrough(const MachineBasicBlock *MBB) const { // If this is a landing pad, it isn't a fall through. If it has no preds, // then nothing falls through to it. if (MBB->isLandingPad() || MBB->pred_empty() || MBB->hasAddressTaken()) return false; // If there isn't exactly one predecessor, it can't be a fall through. MachineBasicBlock::const_pred_iterator PI = MBB->pred_begin(), PI2 = PI; if (++PI2 != MBB->pred_end()) return false; // The predecessor has to be immediately before this block. const MachineBasicBlock *Pred = *PI; if (!Pred->isLayoutSuccessor(MBB)) return false; // if the block starts a new cache block, do not fall through (we need to // insert cache stuff, even if we only reach this block from a jump from the // previous block, and we need the label). if (isFStart(MBB)) return false; // If the block is completely empty, then it definitely does fall through. if (Pred->empty()) return true; // Here is the difference to the AsmPrinter method; // We do not check properties of all terminator instructions // (delay slot instructions do not have to be terminators), // but instead check if the *last terminator* is an // unconditional branch (no barrier) MachineBasicBlock::const_iterator I = Pred->end(); // find last terminator while (I != Pred->begin() && !(--I)->isTerminator()) ; return I == Pred->end() || !I->isBarrier(); }
/// isBlockOnlyReachableByFallthough - Return true if the basic block has /// exactly one predecessor and the control transfer mechanism between /// the predecessor and this block is a fall-through. // FIXME: could the overridden cases be handled in AnalyzeBranch? bool OR1KAsmPrinter::isBlockOnlyReachableByFallthrough(const MachineBasicBlock* MBB) const { // The predecessor has to be immediately before this block. const MachineBasicBlock *Pred = *MBB->pred_begin(); // If the predecessor is a switch statement, assume a jump table // implementation, so it is not a fall through. if (const BasicBlock *bb = Pred->getBasicBlock()) if (isa<SwitchInst>(bb->getTerminator())) return false; // Check default implementation if (!AsmPrinter::isBlockOnlyReachableByFallthrough(MBB)) return false; // Otherwise, check the last instruction. // Check if the last terminator is an unconditional branch. MachineBasicBlock::const_iterator I = Pred->end(); while (I != Pred->begin() && !(--I)->isTerminator()) ; return !I->isBarrier(); }
/// isBlockOnlyReachableByFallthough - Return true if the basic block has /// exactly one predecessor and the control transfer mechanism between /// the predecessor and this block is a fall-through. bool MipsAsmPrinter::isBlockOnlyReachableByFallthrough(const MachineBasicBlock* MBB) const { // The predecessor has to be immediately before this block. const MachineBasicBlock *Pred = *MBB->pred_begin(); // If the predecessor is a switch statement, assume a jump table // implementation, so it is not a fall through. if (const BasicBlock *bb = Pred->getBasicBlock()) if (isa<SwitchInst>(bb->getTerminator())) return false; // If this is a landing pad, it isn't a fall through. If it has no preds, // then nothing falls through to it. if (MBB->isEHPad() || MBB->pred_empty()) return false; // If there isn't exactly one predecessor, it can't be a fall through. MachineBasicBlock::const_pred_iterator PI = MBB->pred_begin(), PI2 = PI; ++PI2; if (PI2 != MBB->pred_end()) return false; // The predecessor has to be immediately before this block. if (!Pred->isLayoutSuccessor(MBB)) return false; // If the block is completely empty, then it definitely does fall through. if (Pred->empty()) return true; // Otherwise, check the last instruction. // Check if the last terminator is an unconditional branch. MachineBasicBlock::const_iterator I = Pred->end(); while (I != Pred->begin() && !(--I)->isTerminator()) ; return !I->isBarrier(); }