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