/// findDebugLoc - find the next valid DebugLoc starting at MBBI, skipping /// any DBG_VALUE instructions. Return UnknownLoc if there is none. DebugLoc MachineBasicBlock::findDebugLoc(instr_iterator MBBI) { DebugLoc DL; instr_iterator E = instr_end(); if (MBBI == E) return DL; // Skip debug declarations, we don't want a DebugLoc from them. while (MBBI != E && MBBI->isDebugValue()) MBBI++; if (MBBI != E) DL = MBBI->getDebugLoc(); return DL; }
/// Find the next valid DebugLoc starting at MBBI, skipping any DBG_VALUE /// instructions. Return UnknownLoc if there is none. DebugLoc MachineBasicBlock::findDebugLoc(instr_iterator MBBI) { // Skip debug declarations, we don't want a DebugLoc from them. MBBI = skipDebugInstructionsForward(MBBI, instr_end()); if (MBBI != instr_end()) return MBBI->getDebugLoc(); return {}; }
MachineBasicBlock::instr_iterator MachineBasicBlock::insert(instr_iterator I, MachineInstr *MI) { assert(!MI->isBundledWithPred() && !MI->isBundledWithSucc() && "Cannot insert instruction with bundle flags"); // Set the bundle flags when inserting inside a bundle. if (I != instr_end() && I->isBundledWithPred()) { MI->setFlag(MachineInstr::BundledPred); MI->setFlag(MachineInstr::BundledSucc); } return Insts.insert(I, MI); }
/// When moving a range of instructions from one MBB list to another, we need to /// update the parent pointers and the use/def lists. void ilist_traits<MachineInstr>::transferNodesFromList(ilist_traits &FromList, instr_iterator First, instr_iterator Last) { assert(Parent->getParent() == FromList.Parent->getParent() && "MachineInstr parent mismatch!"); assert(this != &FromList && "Called without a real transfer..."); assert(Parent != FromList.Parent && "Two lists have the same parent?"); // If splicing between two blocks within the same function, just update the // parent pointers. for (; First != Last; ++First) First->setParent(Parent); }