1 //===- LiveDebugVariables.cpp - Tracking debug info variables -------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the LiveDebugVariables analysis.
12 // Remove all DBG_VALUE instructions referencing virtual registers and replace
13 // them with a data structure tracking where live user variables are kept - in a
14 // virtual register or in a stack slot.
16 // Allow the data structure to be updated during register allocation when values
17 // are moved between registers and stack slots. Finally emit new DBG_VALUE
18 // instructions after register allocation is complete.
20 //===----------------------------------------------------------------------===//
22 #define DEBUG_TYPE "livedebug"
23 #include "LiveDebugVariables.h"
24 #include "VirtRegMap.h"
25 #include "llvm/Constants.h"
26 #include "llvm/Metadata.h"
27 #include "llvm/Value.h"
28 #include "llvm/ADT/IntervalMap.h"
29 #include "llvm/CodeGen/LiveIntervalAnalysis.h"
30 #include "llvm/CodeGen/MachineDominators.h"
31 #include "llvm/CodeGen/MachineFunction.h"
32 #include "llvm/CodeGen/MachineInstrBuilder.h"
33 #include "llvm/CodeGen/MachineRegisterInfo.h"
34 #include "llvm/CodeGen/Passes.h"
35 #include "llvm/Support/CommandLine.h"
36 #include "llvm/Support/Debug.h"
37 #include "llvm/Target/TargetInstrInfo.h"
38 #include "llvm/Target/TargetMachine.h"
39 #include "llvm/Target/TargetRegisterInfo.h"
44 EnableLDV("live-debug-variables", cl::init(true),
45 cl::desc("Enable the live debug variables pass"), cl::Hidden
);
47 char LiveDebugVariables::ID
= 0;
49 INITIALIZE_PASS_BEGIN(LiveDebugVariables
, "livedebugvars",
50 "Debug Variable Analysis", false, false)
51 INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree
)
52 INITIALIZE_PASS_DEPENDENCY(LiveIntervals
)
53 INITIALIZE_PASS_END(LiveDebugVariables
, "livedebugvars",
54 "Debug Variable Analysis", false, false)
56 void LiveDebugVariables::getAnalysisUsage(AnalysisUsage
&AU
) const {
57 AU
.addRequired
<MachineDominatorTree
>();
58 AU
.addRequiredTransitive
<LiveIntervals
>();
60 MachineFunctionPass::getAnalysisUsage(AU
);
63 LiveDebugVariables::LiveDebugVariables() : MachineFunctionPass(ID
), pImpl(0) {
64 initializeLiveDebugVariablesPass(*PassRegistry::getPassRegistry());
67 /// LocMap - Map of where a user value is live, and its location.
68 typedef IntervalMap
<SlotIndex
, unsigned, 4> LocMap
;
70 /// UserValue - A user value is a part of a debug info user variable.
72 /// A DBG_VALUE instruction notes that (a sub-register of) a virtual register
73 /// holds part of a user variable. The part is identified by a byte offset.
75 /// UserValues are grouped into equivalence classes for easier searching. Two
76 /// user values are related if they refer to the same variable, or if they are
77 /// held by the same virtual register. The equivalence class is the transitive
78 /// closure of that relation.
82 const MDNode
*variable
; ///< The debug info variable we are part of.
83 unsigned offset
; ///< Byte offset into variable.
84 DebugLoc dl
; ///< The debug location for the variable. This is
85 ///< used by dwarf writer to find lexical scope.
86 UserValue
*leader
; ///< Equivalence class leader.
87 UserValue
*next
; ///< Next value in equivalence class, or null.
89 /// Numbered locations referenced by locmap.
90 SmallVector
<MachineOperand
, 4> locations
;
92 /// Map of slot indices where this value is live.
95 /// coalesceLocation - After LocNo was changed, check if it has become
96 /// identical to another location, and coalesce them. This may cause LocNo or
97 /// a later location to be erased, but no earlier location will be erased.
98 void coalesceLocation(unsigned LocNo
);
100 /// insertDebugValue - Insert a DBG_VALUE into MBB at Idx for LocNo.
101 void insertDebugValue(MachineBasicBlock
*MBB
, SlotIndex Idx
, unsigned LocNo
,
102 LiveIntervals
&LIS
, const TargetInstrInfo
&TII
);
105 /// UserValue - Create a new UserValue.
106 UserValue(const MDNode
*var
, unsigned o
, DebugLoc L
,
107 LocMap::Allocator
&alloc
)
108 : variable(var
), offset(o
), dl(L
), leader(this), next(0), locInts(alloc
)
111 /// getLeader - Get the leader of this value's equivalence class.
112 UserValue
*getLeader() {
113 UserValue
*l
= leader
;
114 while (l
!= l
->leader
)
119 /// getNext - Return the next UserValue in the equivalence class.
120 UserValue
*getNext() const { return next
; }
122 /// match - Does this UserValue match the aprameters?
123 bool match(const MDNode
*Var
, unsigned Offset
) const {
124 return Var
== variable
&& Offset
== offset
;
127 /// merge - Merge equivalence classes.
128 static UserValue
*merge(UserValue
*L1
, UserValue
*L2
) {
129 L2
= L2
->getLeader();
132 L1
= L1
->getLeader();
135 // Splice L2 before L1's members.
138 End
->leader
= L1
, End
= End
->next
;
140 End
->next
= L1
->next
;
145 /// getLocationNo - Return the location number that matches Loc.
146 unsigned getLocationNo(const MachineOperand
&LocMO
) {
148 if (LocMO
.getReg() == 0)
150 // For register locations we dont care about use/def and other flags.
151 for (unsigned i
= 0, e
= locations
.size(); i
!= e
; ++i
)
152 if (locations
[i
].isReg() &&
153 locations
[i
].getReg() == LocMO
.getReg() &&
154 locations
[i
].getSubReg() == LocMO
.getSubReg())
157 for (unsigned i
= 0, e
= locations
.size(); i
!= e
; ++i
)
158 if (LocMO
.isIdenticalTo(locations
[i
]))
160 locations
.push_back(LocMO
);
161 // We are storing a MachineOperand outside a MachineInstr.
162 locations
.back().clearParent();
163 // Don't store def operands.
164 if (locations
.back().isReg())
165 locations
.back().setIsUse();
166 return locations
.size() - 1;
169 /// mapVirtRegs - Ensure that all virtual register locations are mapped.
170 void mapVirtRegs(LDVImpl
*LDV
);
172 /// addDef - Add a definition point to this value.
173 void addDef(SlotIndex Idx
, const MachineOperand
&LocMO
) {
174 // Add a singular (Idx,Idx) -> Loc mapping.
175 LocMap::iterator I
= locInts
.find(Idx
);
176 if (!I
.valid() || I
.start() != Idx
)
177 I
.insert(Idx
, Idx
.getNextSlot(), getLocationNo(LocMO
));
180 /// extendDef - Extend the current definition as far as possible down the
181 /// dominator tree. Stop when meeting an existing def or when leaving the live
183 /// End points where VNI is no longer live are added to Kills.
184 /// @param Idx Starting point for the definition.
185 /// @param LocNo Location number to propagate.
186 /// @param LI Restrict liveness to where LI has the value VNI. May be null.
187 /// @param VNI When LI is not null, this is the value to restrict to.
188 /// @param Kills Append end points of VNI's live range to Kills.
189 /// @param LIS Live intervals analysis.
190 /// @param MDT Dominator tree.
191 void extendDef(SlotIndex Idx
, unsigned LocNo
,
192 LiveInterval
*LI
, const VNInfo
*VNI
,
193 SmallVectorImpl
<SlotIndex
> *Kills
,
194 LiveIntervals
&LIS
, MachineDominatorTree
&MDT
);
196 /// addDefsFromCopies - The value in LI/LocNo may be copies to other
197 /// registers. Determine if any of the copies are available at the kill
198 /// points, and add defs if possible.
199 /// @param LI Scan for copies of the value in LI->reg.
200 /// @param LocNo Location number of LI->reg.
201 /// @param Kills Points where the range of LocNo could be extended.
202 /// @param NewDefs Append (Idx, LocNo) of inserted defs here.
203 void addDefsFromCopies(LiveInterval
*LI
, unsigned LocNo
,
204 const SmallVectorImpl
<SlotIndex
> &Kills
,
205 SmallVectorImpl
<std::pair
<SlotIndex
, unsigned> > &NewDefs
,
206 MachineRegisterInfo
&MRI
,
209 /// computeIntervals - Compute the live intervals of all locations after
210 /// collecting all their def points.
211 void computeIntervals(MachineRegisterInfo
&MRI
,
212 LiveIntervals
&LIS
, MachineDominatorTree
&MDT
);
214 /// renameRegister - Update locations to rewrite OldReg as NewReg:SubIdx.
215 void renameRegister(unsigned OldReg
, unsigned NewReg
, unsigned SubIdx
,
216 const TargetRegisterInfo
*TRI
);
218 /// rewriteLocations - Rewrite virtual register locations according to the
219 /// provided virtual register map.
220 void rewriteLocations(VirtRegMap
&VRM
, const TargetRegisterInfo
&TRI
);
222 /// emitDebugVariables - Recreate DBG_VALUE instruction from data structures.
223 void emitDebugValues(VirtRegMap
*VRM
,
224 LiveIntervals
&LIS
, const TargetInstrInfo
&TRI
);
226 /// findDebugLoc - Return DebugLoc used for this DBG_VALUE instruction. A
227 /// variable may have more than one corresponding DBG_VALUE instructions.
228 /// Only first one needs DebugLoc to identify variable's lexical scope
230 DebugLoc
findDebugLoc();
231 void print(raw_ostream
&, const TargetRegisterInfo
*);
235 /// LDVImpl - Implementation of the LiveDebugVariables pass.
238 LiveDebugVariables
&pass
;
239 LocMap::Allocator allocator
;
242 MachineDominatorTree
*MDT
;
243 const TargetRegisterInfo
*TRI
;
245 /// userValues - All allocated UserValue instances.
246 SmallVector
<UserValue
*, 8> userValues
;
248 /// Map virtual register to eq class leader.
249 typedef DenseMap
<unsigned, UserValue
*> VRMap
;
250 VRMap virtRegToEqClass
;
252 /// Map user variable to eq class leader.
253 typedef DenseMap
<const MDNode
*, UserValue
*> UVMap
;
256 /// getUserValue - Find or create a UserValue.
257 UserValue
*getUserValue(const MDNode
*Var
, unsigned Offset
, DebugLoc DL
);
259 /// lookupVirtReg - Find the EC leader for VirtReg or null.
260 UserValue
*lookupVirtReg(unsigned VirtReg
);
262 /// handleDebugValue - Add DBG_VALUE instruction to our maps.
263 /// @param MI DBG_VALUE instruction
264 /// @param Idx Last valid SLotIndex before instruction.
265 /// @return True if the DBG_VALUE instruction should be deleted.
266 bool handleDebugValue(MachineInstr
*MI
, SlotIndex Idx
);
268 /// collectDebugValues - Collect and erase all DBG_VALUE instructions, adding
269 /// a UserValue def for each instruction.
270 /// @param mf MachineFunction to be scanned.
271 /// @return True if any debug values were found.
272 bool collectDebugValues(MachineFunction
&mf
);
274 /// computeIntervals - Compute the live intervals of all user values after
275 /// collecting all their def points.
276 void computeIntervals();
279 LDVImpl(LiveDebugVariables
*ps
) : pass(*ps
) {}
280 bool runOnMachineFunction(MachineFunction
&mf
);
282 /// clear - Relase all memory.
284 DeleteContainerPointers(userValues
);
286 virtRegToEqClass
.clear();
290 /// mapVirtReg - Map virtual register to an equivalence class.
291 void mapVirtReg(unsigned VirtReg
, UserValue
*EC
);
293 /// renameRegister - Replace all references to OldReg with NewReg:SubIdx.
294 void renameRegister(unsigned OldReg
, unsigned NewReg
, unsigned SubIdx
);
296 /// emitDebugVariables - Recreate DBG_VALUE instruction from data structures.
297 void emitDebugValues(VirtRegMap
*VRM
);
299 void print(raw_ostream
&);
303 void UserValue::print(raw_ostream
&OS
, const TargetRegisterInfo
*TRI
) {
304 if (const MDString
*MDS
= dyn_cast
<MDString
>(variable
->getOperand(2)))
305 OS
<< "!\"" << MDS
->getString() << "\"\t";
308 for (LocMap::const_iterator I
= locInts
.begin(); I
.valid(); ++I
) {
309 OS
<< " [" << I
.start() << ';' << I
.stop() << "):";
310 if (I
.value() == ~0u)
315 for (unsigned i
= 0, e
= locations
.size(); i
!= e
; ++i
)
316 OS
<< " Loc" << i
<< '=' << locations
[i
];
320 void LDVImpl::print(raw_ostream
&OS
) {
321 OS
<< "********** DEBUG VARIABLES **********\n";
322 for (unsigned i
= 0, e
= userValues
.size(); i
!= e
; ++i
)
323 userValues
[i
]->print(OS
, TRI
);
326 void UserValue::coalesceLocation(unsigned LocNo
) {
327 unsigned KeepLoc
= 0;
328 for (unsigned e
= locations
.size(); KeepLoc
!= e
; ++KeepLoc
) {
329 if (KeepLoc
== LocNo
)
331 if (locations
[KeepLoc
].isIdenticalTo(locations
[LocNo
]))
335 if (KeepLoc
== locations
.size())
338 // Keep the smaller location, erase the larger one.
339 unsigned EraseLoc
= LocNo
;
340 if (KeepLoc
> EraseLoc
)
341 std::swap(KeepLoc
, EraseLoc
);
342 locations
.erase(locations
.begin() + EraseLoc
);
345 for (LocMap::iterator I
= locInts
.begin(); I
.valid(); ++I
) {
346 unsigned v
= I
.value();
348 I
.setValue(KeepLoc
); // Coalesce when possible.
349 else if (v
> EraseLoc
)
350 I
.setValueUnchecked(v
-1); // Avoid coalescing with untransformed values.
354 void UserValue::mapVirtRegs(LDVImpl
*LDV
) {
355 for (unsigned i
= 0, e
= locations
.size(); i
!= e
; ++i
)
356 if (locations
[i
].isReg() &&
357 TargetRegisterInfo::isVirtualRegister(locations
[i
].getReg()))
358 LDV
->mapVirtReg(locations
[i
].getReg(), this);
361 UserValue
*LDVImpl::getUserValue(const MDNode
*Var
, unsigned Offset
,
363 UserValue
*&Leader
= userVarMap
[Var
];
365 UserValue
*UV
= Leader
->getLeader();
367 for (; UV
; UV
= UV
->getNext())
368 if (UV
->match(Var
, Offset
))
372 UserValue
*UV
= new UserValue(Var
, Offset
, DL
, allocator
);
373 userValues
.push_back(UV
);
374 Leader
= UserValue::merge(Leader
, UV
);
378 void LDVImpl::mapVirtReg(unsigned VirtReg
, UserValue
*EC
) {
379 assert(TargetRegisterInfo::isVirtualRegister(VirtReg
) && "Only map VirtRegs");
380 UserValue
*&Leader
= virtRegToEqClass
[VirtReg
];
381 Leader
= UserValue::merge(Leader
, EC
);
384 UserValue
*LDVImpl::lookupVirtReg(unsigned VirtReg
) {
385 if (UserValue
*UV
= virtRegToEqClass
.lookup(VirtReg
))
386 return UV
->getLeader();
390 bool LDVImpl::handleDebugValue(MachineInstr
*MI
, SlotIndex Idx
) {
391 // DBG_VALUE loc, offset, variable
392 if (MI
->getNumOperands() != 3 ||
393 !MI
->getOperand(1).isImm() || !MI
->getOperand(2).isMetadata()) {
394 DEBUG(dbgs() << "Can't handle " << *MI
);
398 // Get or create the UserValue for (variable,offset).
399 unsigned Offset
= MI
->getOperand(1).getImm();
400 const MDNode
*Var
= MI
->getOperand(2).getMetadata();
401 UserValue
*UV
= getUserValue(Var
, Offset
, MI
->getDebugLoc());
402 UV
->addDef(Idx
, MI
->getOperand(0));
406 bool LDVImpl::collectDebugValues(MachineFunction
&mf
) {
407 bool Changed
= false;
408 for (MachineFunction::iterator MFI
= mf
.begin(), MFE
= mf
.end(); MFI
!= MFE
;
410 MachineBasicBlock
*MBB
= MFI
;
411 for (MachineBasicBlock::iterator MBBI
= MBB
->begin(), MBBE
= MBB
->end();
413 if (!MBBI
->isDebugValue()) {
417 // DBG_VALUE has no slot index, use the previous instruction instead.
418 SlotIndex Idx
= MBBI
== MBB
->begin() ?
419 LIS
->getMBBStartIdx(MBB
) :
420 LIS
->getInstructionIndex(llvm::prior(MBBI
)).getDefIndex();
421 // Handle consecutive DBG_VALUE instructions with the same slot index.
423 if (handleDebugValue(MBBI
, Idx
)) {
424 MBBI
= MBB
->erase(MBBI
);
428 } while (MBBI
!= MBBE
&& MBBI
->isDebugValue());
434 void UserValue::extendDef(SlotIndex Idx
, unsigned LocNo
,
435 LiveInterval
*LI
, const VNInfo
*VNI
,
436 SmallVectorImpl
<SlotIndex
> *Kills
,
437 LiveIntervals
&LIS
, MachineDominatorTree
&MDT
) {
438 SmallVector
<SlotIndex
, 16> Todo
;
442 SlotIndex Start
= Todo
.pop_back_val();
443 MachineBasicBlock
*MBB
= LIS
.getMBBFromIndex(Start
);
444 SlotIndex Stop
= LIS
.getMBBEndIdx(MBB
);
445 LocMap::iterator I
= locInts
.find(Start
);
447 // Limit to VNI's live range.
450 LiveRange
*Range
= LI
->getLiveRangeContaining(Start
);
451 if (!Range
|| Range
->valno
!= VNI
) {
453 Kills
->push_back(Start
);
456 if (Range
->end
< Stop
)
457 Stop
= Range
->end
, ToEnd
= false;
460 // There could already be a short def at Start.
461 if (I
.valid() && I
.start() <= Start
) {
462 // Stop when meeting a different location or an already extended interval.
463 Start
= Start
.getNextSlot();
464 if (I
.value() != LocNo
|| I
.stop() != Start
)
466 // This is a one-slot placeholder. Just skip it.
470 // Limited by the next def.
471 if (I
.valid() && I
.start() < Stop
)
472 Stop
= I
.start(), ToEnd
= false;
473 // Limited by VNI's live range.
474 else if (!ToEnd
&& Kills
)
475 Kills
->push_back(Stop
);
480 I
.insert(Start
, Stop
, LocNo
);
482 // If we extended to the MBB end, propagate down the dominator tree.
485 const std::vector
<MachineDomTreeNode
*> &Children
=
486 MDT
.getNode(MBB
)->getChildren();
487 for (unsigned i
= 0, e
= Children
.size(); i
!= e
; ++i
)
488 Todo
.push_back(LIS
.getMBBStartIdx(Children
[i
]->getBlock()));
489 } while (!Todo
.empty());
493 UserValue::addDefsFromCopies(LiveInterval
*LI
, unsigned LocNo
,
494 const SmallVectorImpl
<SlotIndex
> &Kills
,
495 SmallVectorImpl
<std::pair
<SlotIndex
, unsigned> > &NewDefs
,
496 MachineRegisterInfo
&MRI
, LiveIntervals
&LIS
) {
499 // Don't track copies from physregs, there are too many uses.
500 if (!TargetRegisterInfo::isVirtualRegister(LI
->reg
))
503 // Collect all the (vreg, valno) pairs that are copies of LI.
504 SmallVector
<std::pair
<LiveInterval
*, const VNInfo
*>, 8> CopyValues
;
505 for (MachineRegisterInfo::use_nodbg_iterator
506 UI
= MRI
.use_nodbg_begin(LI
->reg
),
507 UE
= MRI
.use_nodbg_end(); UI
!= UE
; ++UI
) {
508 // Copies of the full value.
509 if (UI
.getOperand().getSubReg() || !UI
->isCopy())
511 MachineInstr
*MI
= &*UI
;
512 unsigned DstReg
= MI
->getOperand(0).getReg();
514 // Don't follow copies to physregs. These are usually setting up call
515 // arguments, and the argument registers are always call clobbered. We are
516 // better off in the source register which could be a callee-saved register,
517 // or it could be spilled.
518 if (!TargetRegisterInfo::isVirtualRegister(DstReg
))
521 // Is LocNo extended to reach this copy? If not, another def may be blocking
522 // it, or we are looking at a wrong value of LI.
523 SlotIndex Idx
= LIS
.getInstructionIndex(MI
);
524 LocMap::iterator I
= locInts
.find(Idx
.getUseIndex());
525 if (!I
.valid() || I
.value() != LocNo
)
528 if (!LIS
.hasInterval(DstReg
))
530 LiveInterval
*DstLI
= &LIS
.getInterval(DstReg
);
531 const VNInfo
*DstVNI
= DstLI
->getVNInfoAt(Idx
.getDefIndex());
532 assert(DstVNI
&& DstVNI
->def
== Idx
.getDefIndex() && "Bad copy value");
533 CopyValues
.push_back(std::make_pair(DstLI
, DstVNI
));
536 if (CopyValues
.empty())
539 DEBUG(dbgs() << "Got " << CopyValues
.size() << " copies of " << *LI
<< '\n');
541 // Try to add defs of the copied values for each kill point.
542 for (unsigned i
= 0, e
= Kills
.size(); i
!= e
; ++i
) {
543 SlotIndex Idx
= Kills
[i
];
544 for (unsigned j
= 0, e
= CopyValues
.size(); j
!= e
; ++j
) {
545 LiveInterval
*DstLI
= CopyValues
[j
].first
;
546 const VNInfo
*DstVNI
= CopyValues
[j
].second
;
547 if (DstLI
->getVNInfoAt(Idx
) != DstVNI
)
549 // Check that there isn't already a def at Idx
550 LocMap::iterator I
= locInts
.find(Idx
);
551 if (I
.valid() && I
.start() <= Idx
)
553 DEBUG(dbgs() << "Kill at " << Idx
<< " covered by valno #"
554 << DstVNI
->id
<< " in " << *DstLI
<< '\n');
555 MachineInstr
*CopyMI
= LIS
.getInstructionFromIndex(DstVNI
->def
);
556 assert(CopyMI
&& CopyMI
->isCopy() && "Bad copy value");
557 unsigned LocNo
= getLocationNo(CopyMI
->getOperand(0));
558 I
.insert(Idx
, Idx
.getNextSlot(), LocNo
);
559 NewDefs
.push_back(std::make_pair(Idx
, LocNo
));
566 UserValue::computeIntervals(MachineRegisterInfo
&MRI
,
568 MachineDominatorTree
&MDT
) {
569 SmallVector
<std::pair
<SlotIndex
, unsigned>, 16> Defs
;
571 // Collect all defs to be extended (Skipping undefs).
572 for (LocMap::const_iterator I
= locInts
.begin(); I
.valid(); ++I
)
573 if (I
.value() != ~0u)
574 Defs
.push_back(std::make_pair(I
.start(), I
.value()));
576 // Extend all defs, and possibly add new ones along the way.
577 for (unsigned i
= 0; i
!= Defs
.size(); ++i
) {
578 SlotIndex Idx
= Defs
[i
].first
;
579 unsigned LocNo
= Defs
[i
].second
;
580 const MachineOperand
&Loc
= locations
[LocNo
];
582 // Register locations are constrained to where the register value is live.
583 if (Loc
.isReg() && LIS
.hasInterval(Loc
.getReg())) {
584 LiveInterval
*LI
= &LIS
.getInterval(Loc
.getReg());
585 const VNInfo
*VNI
= LI
->getVNInfoAt(Idx
);
586 SmallVector
<SlotIndex
, 16> Kills
;
587 extendDef(Idx
, LocNo
, LI
, VNI
, &Kills
, LIS
, MDT
);
588 addDefsFromCopies(LI
, LocNo
, Kills
, Defs
, MRI
, LIS
);
590 extendDef(Idx
, LocNo
, 0, 0, 0, LIS
, MDT
);
593 // Finally, erase all the undefs.
594 for (LocMap::iterator I
= locInts
.begin(); I
.valid();)
595 if (I
.value() == ~0u)
601 void LDVImpl::computeIntervals() {
602 for (unsigned i
= 0, e
= userValues
.size(); i
!= e
; ++i
) {
603 userValues
[i
]->computeIntervals(MF
->getRegInfo(), *LIS
, *MDT
);
604 userValues
[i
]->mapVirtRegs(this);
608 bool LDVImpl::runOnMachineFunction(MachineFunction
&mf
) {
610 LIS
= &pass
.getAnalysis
<LiveIntervals
>();
611 MDT
= &pass
.getAnalysis
<MachineDominatorTree
>();
612 TRI
= mf
.getTarget().getRegisterInfo();
614 DEBUG(dbgs() << "********** COMPUTING LIVE DEBUG VARIABLES: "
615 << ((Value
*)mf
.getFunction())->getName()
618 bool Changed
= collectDebugValues(mf
);
620 DEBUG(print(dbgs()));
624 bool LiveDebugVariables::runOnMachineFunction(MachineFunction
&mf
) {
628 pImpl
= new LDVImpl(this);
629 return static_cast<LDVImpl
*>(pImpl
)->runOnMachineFunction(mf
);
632 void LiveDebugVariables::releaseMemory() {
634 static_cast<LDVImpl
*>(pImpl
)->clear();
637 LiveDebugVariables::~LiveDebugVariables() {
639 delete static_cast<LDVImpl
*>(pImpl
);
643 renameRegister(unsigned OldReg
, unsigned NewReg
, unsigned SubIdx
,
644 const TargetRegisterInfo
*TRI
) {
645 for (unsigned i
= locations
.size(); i
; --i
) {
646 unsigned LocNo
= i
- 1;
647 MachineOperand
&Loc
= locations
[LocNo
];
648 if (!Loc
.isReg() || Loc
.getReg() != OldReg
)
650 if (TargetRegisterInfo::isPhysicalRegister(NewReg
))
651 Loc
.substPhysReg(NewReg
, *TRI
);
653 Loc
.substVirtReg(NewReg
, SubIdx
, *TRI
);
654 coalesceLocation(LocNo
);
659 renameRegister(unsigned OldReg
, unsigned NewReg
, unsigned SubIdx
) {
660 UserValue
*UV
= lookupVirtReg(OldReg
);
664 if (TargetRegisterInfo::isVirtualRegister(NewReg
))
665 mapVirtReg(NewReg
, UV
);
666 virtRegToEqClass
.erase(OldReg
);
669 UV
->renameRegister(OldReg
, NewReg
, SubIdx
, TRI
);
674 void LiveDebugVariables::
675 renameRegister(unsigned OldReg
, unsigned NewReg
, unsigned SubIdx
) {
677 static_cast<LDVImpl
*>(pImpl
)->renameRegister(OldReg
, NewReg
, SubIdx
);
681 UserValue::rewriteLocations(VirtRegMap
&VRM
, const TargetRegisterInfo
&TRI
) {
682 // Iterate over locations in reverse makes it easier to handle coalescing.
683 for (unsigned i
= locations
.size(); i
; --i
) {
684 unsigned LocNo
= i
-1;
685 MachineOperand
&Loc
= locations
[LocNo
];
686 // Only virtual registers are rewritten.
687 if (!Loc
.isReg() || !Loc
.getReg() ||
688 !TargetRegisterInfo::isVirtualRegister(Loc
.getReg()))
690 unsigned VirtReg
= Loc
.getReg();
691 if (VRM
.isAssignedReg(VirtReg
) &&
692 TargetRegisterInfo::isPhysicalRegister(VRM
.getPhys(VirtReg
))) {
693 Loc
.substPhysReg(VRM
.getPhys(VirtReg
), TRI
);
694 } else if (VRM
.getStackSlot(VirtReg
) != VirtRegMap::NO_STACK_SLOT
&&
695 VRM
.isSpillSlotUsed(VRM
.getStackSlot(VirtReg
))) {
696 // FIXME: Translate SubIdx to a stackslot offset.
697 Loc
= MachineOperand::CreateFI(VRM
.getStackSlot(VirtReg
));
702 coalesceLocation(LocNo
);
704 DEBUG(print(dbgs(), &TRI
));
707 /// findInsertLocation - Find an iterator for inserting a DBG_VALUE
709 static MachineBasicBlock::iterator
710 findInsertLocation(MachineBasicBlock
*MBB
, SlotIndex Idx
,
711 LiveIntervals
&LIS
) {
712 SlotIndex Start
= LIS
.getMBBStartIdx(MBB
);
713 Idx
= Idx
.getBaseIndex();
715 // Try to find an insert location by going backwards from Idx.
717 while (!(MI
= LIS
.getInstructionFromIndex(Idx
))) {
718 // We've reached the beginning of MBB.
720 MachineBasicBlock::iterator I
= MBB
->SkipPHIsAndLabels(MBB
->begin());
723 Idx
= Idx
.getPrevIndex();
726 // Don't insert anything after the first terminator, though.
727 return MI
->getDesc().isTerminator() ? MBB
->getFirstTerminator() :
728 llvm::next(MachineBasicBlock::iterator(MI
));
731 DebugLoc
UserValue::findDebugLoc() {
736 void UserValue::insertDebugValue(MachineBasicBlock
*MBB
, SlotIndex Idx
,
739 const TargetInstrInfo
&TII
) {
740 MachineBasicBlock::iterator I
= findInsertLocation(MBB
, Idx
, LIS
);
741 MachineOperand
&Loc
= locations
[LocNo
];
743 // Frame index locations may require a target callback.
745 MachineInstr
*MI
= TII
.emitFrameIndexDebugValue(*MBB
->getParent(),
746 Loc
.getIndex(), offset
, variable
,
753 // This is not a frame index, or the target is happy with a standard FI.
754 BuildMI(*MBB
, I
, findDebugLoc(), TII
.get(TargetOpcode::DBG_VALUE
))
755 .addOperand(Loc
).addImm(offset
).addMetadata(variable
);
758 void UserValue::emitDebugValues(VirtRegMap
*VRM
, LiveIntervals
&LIS
,
759 const TargetInstrInfo
&TII
) {
760 MachineFunction::iterator MFEnd
= VRM
->getMachineFunction().end();
762 for (LocMap::const_iterator I
= locInts
.begin(); I
.valid();) {
763 SlotIndex Start
= I
.start();
764 SlotIndex Stop
= I
.stop();
765 unsigned LocNo
= I
.value();
766 DEBUG(dbgs() << "\t[" << Start
<< ';' << Stop
<< "):" << LocNo
);
767 MachineFunction::iterator MBB
= LIS
.getMBBFromIndex(Start
);
768 SlotIndex MBBEnd
= LIS
.getMBBEndIdx(MBB
);
770 DEBUG(dbgs() << " BB#" << MBB
->getNumber() << '-' << MBBEnd
);
771 insertDebugValue(MBB
, Start
, LocNo
, LIS
, TII
);
773 // This interval may span multiple basic blocks.
774 // Insert a DBG_VALUE into each one.
775 while(Stop
> MBBEnd
) {
776 // Move to the next block.
780 MBBEnd
= LIS
.getMBBEndIdx(MBB
);
781 DEBUG(dbgs() << " BB#" << MBB
->getNumber() << '-' << MBBEnd
);
782 insertDebugValue(MBB
, Start
, LocNo
, LIS
, TII
);
784 DEBUG(dbgs() << '\n');
792 void LDVImpl::emitDebugValues(VirtRegMap
*VRM
) {
793 DEBUG(dbgs() << "********** EMITTING LIVE DEBUG VARIABLES **********\n");
794 const TargetInstrInfo
*TII
= MF
->getTarget().getInstrInfo();
795 for (unsigned i
= 0, e
= userValues
.size(); i
!= e
; ++i
) {
796 userValues
[i
]->rewriteLocations(*VRM
, *TRI
);
797 userValues
[i
]->emitDebugValues(VRM
, *LIS
, *TII
);
801 void LiveDebugVariables::emitDebugValues(VirtRegMap
*VRM
) {
803 static_cast<LDVImpl
*>(pImpl
)->emitDebugValues(VRM
);
808 void LiveDebugVariables::dump() {
810 static_cast<LDVImpl
*>(pImpl
)->print(dbgs());