1dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//===-- llvm/CodeGen/AsmPrinter/DbgValueHistoryCalculator.cpp -------------===// 2dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// 3dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// The LLVM Compiler Infrastructure 4dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// 5dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// This file is distributed under the University of Illinois Open Source 6dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// License. See LICENSE.TXT for details. 7dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// 8dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//===----------------------------------------------------------------------===// 9dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 10dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "DbgValueHistoryCalculator.h" 11dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/ADT/SmallVector.h" 12dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/CodeGen/MachineBasicBlock.h" 13dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/CodeGen/MachineFunction.h" 14dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/Support/Debug.h" 15dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/Target/TargetRegisterInfo.h" 16dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include <algorithm> 17dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include <map> 18cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include <set> 19dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 20dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "dwarfdebug" 21dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 22dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesnamespace llvm { 23dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 24dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// \brief If @MI is a DBG_VALUE with debug value described by a 25dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// defined register, returns the number of this register. 26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// In the other case, returns 0. 27dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstatic unsigned isDescribedByReg(const MachineInstr &MI) { 28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(MI.isDebugValue()); 29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(MI.getNumOperands() == 3); 30dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // If location of variable is described using a register (directly or 31dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // indirecltly), this register is always a first operand. 32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return MI.getOperand(0).isReg() ? MI.getOperand(0).getReg() : 0; 33dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 34dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DbgValueHistoryMap::startInstrRange(const MDNode *Var, 36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MachineInstr &MI) { 37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Instruction range should start with a DBG_VALUE instruction for the 38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // variable. 39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(MI.isDebugValue() && MI.getDebugVariable() == Var); 40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto &Ranges = VarInstrRanges[Var]; 41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!Ranges.empty() && Ranges.back().second == nullptr && 42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Ranges.back().first->isIdenticalTo(&MI)) { 43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n" 44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines << "\t" << Ranges.back().first << "\t" << MI << "\n"); 45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return; 46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Ranges.push_back(std::make_pair(&MI, nullptr)); 48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DbgValueHistoryMap::endInstrRange(const MDNode *Var, 51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MachineInstr &MI) { 52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto &Ranges = VarInstrRanges[Var]; 53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Verify that the current instruction range is not yet closed. 54dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(!Ranges.empty() && Ranges.back().second == nullptr); 55dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // For now, instruction ranges are not allowed to cross basic block 56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // boundaries. 57dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(Ranges.back().first->getParent() == MI.getParent()); 58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Ranges.back().second = &MI; 59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesunsigned DbgValueHistoryMap::getRegisterForVar(const MDNode *Var) const { 62dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const auto &I = VarInstrRanges.find(Var); 63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (I == VarInstrRanges.end()) 64dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return 0; 65dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const auto &Ranges = I->second; 66dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (Ranges.empty() || Ranges.back().second != nullptr) 67dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return 0; 68dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return isDescribedByReg(*Ranges.back().first); 69dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 70dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 71dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesnamespace { 72dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// Maps physreg numbers to the variables they describe. 73dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinestypedef std::map<unsigned, SmallVector<const MDNode *, 1>> RegDescribedVarsMap; 74dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 75dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 76dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// \brief Claim that @Var is not described by @RegNo anymore. 77dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstatic void dropRegDescribedVar(RegDescribedVarsMap &RegVars, 78dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned RegNo, const MDNode *Var) { 79dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const auto &I = RegVars.find(RegNo); 80dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(RegNo != 0U && I != RegVars.end()); 81dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto &VarSet = I->second; 82dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const auto &VarPos = std::find(VarSet.begin(), VarSet.end(), Var); 83dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(VarPos != VarSet.end()); 84dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines VarSet.erase(VarPos); 85dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Don't keep empty sets in a map to keep it as small as possible. 86dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (VarSet.empty()) 87dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines RegVars.erase(I); 88dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 89dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 90dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// \brief Claim that @Var is now described by @RegNo. 91dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstatic void addRegDescribedVar(RegDescribedVarsMap &RegVars, 92dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned RegNo, const MDNode *Var) { 93dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(RegNo != 0U); 94dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto &VarSet = RegVars[RegNo]; 95dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(std::find(VarSet.begin(), VarSet.end(), Var) == VarSet.end()); 96dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines VarSet.push_back(Var); 97dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 98dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 99dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// \brief Terminate the location range for variables described by register 100dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// @RegNo by inserting @ClobberingInstr to their history. 101dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstatic void clobberRegisterUses(RegDescribedVarsMap &RegVars, unsigned RegNo, 102dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DbgValueHistoryMap &HistMap, 103dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MachineInstr &ClobberingInstr) { 104dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const auto &I = RegVars.find(RegNo); 105dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (I == RegVars.end()) 106dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return; 107dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Iterate over all variables described by this register and add this 108dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // instruction to their history, clobbering it. 109dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines for (const auto &Var : I->second) 110dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines HistMap.endInstrRange(Var, ClobberingInstr); 111dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines RegVars.erase(I); 112dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 113dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 114cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// \brief Collect all registers clobbered by @MI and insert them to @Regs. 115cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesstatic void collectClobberedRegisters(const MachineInstr &MI, 116cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const TargetRegisterInfo *TRI, 117cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines std::set<unsigned> &Regs) { 118dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines for (const MachineOperand &MO : MI.operands()) { 119dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!MO.isReg() || !MO.isDef() || !MO.getReg()) 120dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines continue; 121cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines for (MCRegAliasIterator AI(MO.getReg(), TRI, true); AI.isValid(); ++AI) 122cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Regs.insert(*AI); 123dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 124dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 125dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 126cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// \brief Returns the first instruction in @MBB which corresponds to 127cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// the function epilogue, or nullptr if @MBB doesn't contain an epilogue. 128cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesstatic const MachineInstr *getFirstEpilogueInst(const MachineBasicBlock &MBB) { 129cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines auto LastMI = MBB.getLastNonDebugInstr(); 130cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (LastMI == MBB.end() || !LastMI->isReturn()) 131cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return nullptr; 132cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Assume that epilogue starts with instruction having the same debug location 133cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // as the return instruction. 134cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DebugLoc LastLoc = LastMI->getDebugLoc(); 135cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines auto Res = LastMI; 136cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines for (MachineBasicBlock::const_reverse_iterator I(std::next(LastMI)); I != MBB.rend(); 137cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines ++I) { 138cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (I->getDebugLoc() != LastLoc) 139cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return Res; 140cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Res = std::prev(I.base()); 141cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 142cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // If all instructions have the same debug location, assume whole MBB is 143cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // an epilogue. 144cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return MBB.begin(); 145cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 146cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 147cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// \brief Collect registers that are modified in the function body (their 148cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// contents is changed only in the prologue and epilogue). 149cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesstatic void collectChangingRegs(const MachineFunction *MF, 150cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const TargetRegisterInfo *TRI, 151cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines std::set<unsigned> &Regs) { 152cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines for (const auto &MBB : *MF) { 153cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines auto FirstEpilogueInst = getFirstEpilogueInst(MBB); 154cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool IsInEpilogue = false; 155cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines for (const auto &MI : MBB) { 156cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines IsInEpilogue |= &MI == FirstEpilogueInst; 157cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (!MI.getFlag(MachineInstr::FrameSetup) && !IsInEpilogue) 158cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines collectClobberedRegisters(MI, TRI, Regs); 159cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 160cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 161dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 162dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 163dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid calculateDbgValueHistory(const MachineFunction *MF, 164dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const TargetRegisterInfo *TRI, 165dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DbgValueHistoryMap &Result) { 166cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines std::set<unsigned> ChangingRegs; 167cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines collectChangingRegs(MF, TRI, ChangingRegs); 168dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 169cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines RegDescribedVarsMap RegVars; 170dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines for (const auto &MBB : *MF) { 171dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines for (const auto &MI : MBB) { 172dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!MI.isDebugValue()) { 173dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Not a DBG_VALUE instruction. It may clobber registers which describe 174dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // some variables. 175cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines std::set<unsigned> MIClobberedRegs; 176cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines collectClobberedRegisters(MI, TRI, MIClobberedRegs); 177cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines for (unsigned RegNo : MIClobberedRegs) { 178cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (ChangingRegs.count(RegNo)) 179cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines clobberRegisterUses(RegVars, RegNo, Result, MI); 180cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 181dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines continue; 182dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 183dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 184dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(MI.getNumOperands() > 1 && "Invalid DBG_VALUE instruction!"); 185dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MDNode *Var = MI.getDebugVariable(); 186dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 187dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (unsigned PrevReg = Result.getRegisterForVar(Var)) 188dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines dropRegDescribedVar(RegVars, PrevReg, Var); 189dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 190dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Result.startInstrRange(Var, MI); 191dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 192dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (unsigned NewReg = isDescribedByReg(MI)) 193dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addRegDescribedVar(RegVars, NewReg, Var); 194dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 195dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 196dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Make sure locations for register-described variables are valid only 197dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // until the end of the basic block (unless it's the last basic block, in 198dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // which case let their liveness run off to the end of the function). 199cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (!MBB.empty() && &MBB != &MF->back()) { 200cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines for (unsigned RegNo : ChangingRegs) 201cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines clobberRegisterUses(RegVars, RegNo, Result, MBB.back()); 202cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 203dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 204dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 205dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 206dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 207