1 //===- LiveDebugValues.cpp - Tracking Debug Value MIs ---------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 /// This pass implements a data flow analysis that propagates debug location
10 /// information by inserting additional DBG_VALUE instructions into the machine
11 /// instruction stream. The pass internally builds debug location liveness
12 /// ranges to determine the points where additional DBG_VALUEs need to be
15 /// This is a separate pass from DbgValueHistoryCalculator to facilitate
16 /// testing and improve modularity.
18 //===----------------------------------------------------------------------===//
20 #include "llvm/ADT/DenseMap.h"
21 #include "llvm/ADT/PostOrderIterator.h"
22 #include "llvm/ADT/SmallPtrSet.h"
23 #include "llvm/ADT/SmallVector.h"
24 #include "llvm/ADT/SparseBitVector.h"
25 #include "llvm/ADT/Statistic.h"
26 #include "llvm/ADT/UniqueVector.h"
27 #include "llvm/CodeGen/LexicalScopes.h"
28 #include "llvm/CodeGen/MachineBasicBlock.h"
29 #include "llvm/CodeGen/MachineFrameInfo.h"
30 #include "llvm/CodeGen/MachineFunction.h"
31 #include "llvm/CodeGen/MachineFunctionPass.h"
32 #include "llvm/CodeGen/MachineInstr.h"
33 #include "llvm/CodeGen/MachineInstrBuilder.h"
34 #include "llvm/CodeGen/MachineMemOperand.h"
35 #include "llvm/CodeGen/MachineOperand.h"
36 #include "llvm/CodeGen/PseudoSourceValue.h"
37 #include "llvm/CodeGen/RegisterScavenging.h"
38 #include "llvm/CodeGen/TargetFrameLowering.h"
39 #include "llvm/CodeGen/TargetInstrInfo.h"
40 #include "llvm/CodeGen/TargetLowering.h"
41 #include "llvm/CodeGen/TargetRegisterInfo.h"
42 #include "llvm/CodeGen/TargetSubtargetInfo.h"
43 #include "llvm/Config/llvm-config.h"
44 #include "llvm/IR/DIBuilder.h"
45 #include "llvm/IR/DebugInfoMetadata.h"
46 #include "llvm/IR/DebugLoc.h"
47 #include "llvm/IR/Function.h"
48 #include "llvm/IR/Module.h"
49 #include "llvm/MC/MCRegisterInfo.h"
50 #include "llvm/Pass.h"
51 #include "llvm/Support/Casting.h"
52 #include "llvm/Support/Compiler.h"
53 #include "llvm/Support/Debug.h"
54 #include "llvm/Support/raw_ostream.h"
65 #define DEBUG_TYPE "livedebugvalues"
67 STATISTIC(NumInserted
, "Number of DBG_VALUE instructions inserted");
69 // If @MI is a DBG_VALUE with debug value described by a defined
70 // register, returns the number of this register. In the other case, returns 0.
71 static unsigned isDbgValueDescribedByReg(const MachineInstr
&MI
) {
72 assert(MI
.isDebugValue() && "expected a DBG_VALUE");
73 assert(MI
.getNumOperands() == 4 && "malformed DBG_VALUE");
74 // If location of variable is described using a register (directly
75 // or indirectly), this register is always a first operand.
76 return MI
.getOperand(0).isReg() ? MI
.getOperand(0).getReg() : 0;
81 class LiveDebugValues
: public MachineFunctionPass
{
83 const TargetRegisterInfo
*TRI
;
84 const TargetInstrInfo
*TII
;
85 const TargetFrameLowering
*TFI
;
86 BitVector CalleeSavedRegs
;
89 enum struct TransferKind
{ TransferCopy
, TransferSpill
, TransferRestore
};
91 /// Keeps track of lexical scopes associated with a user value's source
93 class UserValueScopes
{
96 SmallPtrSet
<const MachineBasicBlock
*, 4> LBlocks
;
99 UserValueScopes(DebugLoc D
, LexicalScopes
&L
) : DL(std::move(D
)), LS(L
) {}
101 /// Return true if current scope dominates at least one machine
102 /// instruction in a given machine basic block.
103 bool dominates(MachineBasicBlock
*MBB
) {
105 LS
.getMachineBasicBlocks(DL
, LBlocks
);
106 return LBlocks
.count(MBB
) != 0 || LS
.dominates(DL
, MBB
);
110 /// Based on std::pair so it can be used as an index into a DenseMap.
111 using DebugVariableBase
=
112 std::pair
<const DILocalVariable
*, const DILocation
*>;
113 /// A potentially inlined instance of a variable.
114 struct DebugVariable
: public DebugVariableBase
{
115 DebugVariable(const DILocalVariable
*Var
, const DILocation
*InlinedAt
)
116 : DebugVariableBase(Var
, InlinedAt
) {}
118 const DILocalVariable
*getVar() const { return this->first
; }
119 const DILocation
*getInlinedAt() const { return this->second
; }
121 bool operator<(const DebugVariable
&DV
) const {
122 if (getVar() == DV
.getVar())
123 return getInlinedAt() < DV
.getInlinedAt();
124 return getVar() < DV
.getVar();
128 /// A pair of debug variable and value location.
130 // The location at which a spilled variable resides. It consists of a
131 // register and an offset.
135 bool operator==(const SpillLoc
&Other
) const {
136 return SpillBase
== Other
.SpillBase
&& SpillOffset
== Other
.SpillOffset
;
140 const DebugVariable Var
;
141 const MachineInstr
&MI
; ///< Only used for cloning a new DBG_VALUE.
142 mutable UserValueScopes UVS
;
147 } Kind
= InvalidKind
;
149 /// The value location. Stored separately to avoid repeatedly
150 /// extracting it from MI.
153 SpillLoc SpillLocation
;
157 VarLoc(const MachineInstr
&MI
, LexicalScopes
&LS
)
158 : Var(MI
.getDebugVariable(), MI
.getDebugLoc()->getInlinedAt()), MI(MI
),
159 UVS(MI
.getDebugLoc(), LS
) {
160 static_assert((sizeof(Loc
) == sizeof(uint64_t)),
161 "hash does not cover all members of Loc");
162 assert(MI
.isDebugValue() && "not a DBG_VALUE");
163 assert(MI
.getNumOperands() == 4 && "malformed DBG_VALUE");
164 if (int RegNo
= isDbgValueDescribedByReg(MI
)) {
170 /// The constructor for spill locations.
171 VarLoc(const MachineInstr
&MI
, unsigned SpillBase
, int SpillOffset
,
173 : Var(MI
.getDebugVariable(), MI
.getDebugLoc()->getInlinedAt()), MI(MI
),
174 UVS(MI
.getDebugLoc(), LS
) {
175 assert(MI
.isDebugValue() && "not a DBG_VALUE");
176 assert(MI
.getNumOperands() == 4 && "malformed DBG_VALUE");
178 Loc
.SpillLocation
= {SpillBase
, SpillOffset
};
181 /// If this variable is described by a register, return it,
182 /// otherwise return 0.
183 unsigned isDescribedByReg() const {
184 if (Kind
== RegisterKind
)
189 /// Determine whether the lexical scope of this value's debug location
191 bool dominates(MachineBasicBlock
&MBB
) const { return UVS
.dominates(&MBB
); }
193 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
194 LLVM_DUMP_METHOD
void dump() const { MI
.dump(); }
197 bool operator==(const VarLoc
&Other
) const {
198 return Var
== Other
.Var
&& Loc
.Hash
== Other
.Loc
.Hash
;
201 /// This operator guarantees that VarLocs are sorted by Variable first.
202 bool operator<(const VarLoc
&Other
) const {
203 if (Var
== Other
.Var
)
204 return Loc
.Hash
< Other
.Loc
.Hash
;
205 return Var
< Other
.Var
;
209 using VarLocMap
= UniqueVector
<VarLoc
>;
210 using VarLocSet
= SparseBitVector
<>;
211 using VarLocInMBB
= SmallDenseMap
<const MachineBasicBlock
*, VarLocSet
>;
212 struct TransferDebugPair
{
213 MachineInstr
*TransferInst
;
214 MachineInstr
*DebugInst
;
216 using TransferMap
= SmallVector
<TransferDebugPair
, 4>;
218 /// This holds the working set of currently open ranges. For fast
219 /// access, this is done both as a set of VarLocIDs, and a map of
220 /// DebugVariable to recent VarLocID. Note that a DBG_VALUE ends all
221 /// previous open ranges for the same variable.
222 class OpenRangesSet
{
224 SmallDenseMap
<DebugVariableBase
, unsigned, 8> Vars
;
227 const VarLocSet
&getVarLocs() const { return VarLocs
; }
229 /// Terminate all open ranges for Var by removing it from the set.
230 void erase(DebugVariable Var
) {
231 auto It
= Vars
.find(Var
);
232 if (It
!= Vars
.end()) {
233 unsigned ID
= It
->second
;
239 /// Terminate all open ranges listed in \c KillSet by removing
240 /// them from the set.
241 void erase(const VarLocSet
&KillSet
, const VarLocMap
&VarLocIDs
) {
242 VarLocs
.intersectWithComplement(KillSet
);
243 for (unsigned ID
: KillSet
)
244 Vars
.erase(VarLocIDs
[ID
].Var
);
247 /// Insert a new range into the set.
248 void insert(unsigned VarLocID
, DebugVariableBase Var
) {
249 VarLocs
.set(VarLocID
);
250 Vars
.insert({Var
, VarLocID
});
259 /// Return whether the set is empty or not.
261 assert(Vars
.empty() == VarLocs
.empty() && "open ranges are inconsistent");
262 return VarLocs
.empty();
266 bool isSpillInstruction(const MachineInstr
&MI
, MachineFunction
*MF
,
268 /// If a given instruction is identified as a spill, return the spill location
269 /// and set \p Reg to the spilled register.
270 Optional
<VarLoc::SpillLoc
> isRestoreInstruction(const MachineInstr
&MI
,
273 /// Given a spill instruction, extract the register and offset used to
274 /// address the spill location in a target independent way.
275 VarLoc::SpillLoc
extractSpillBaseRegAndOffset(const MachineInstr
&MI
);
276 void insertTransferDebugPair(MachineInstr
&MI
, OpenRangesSet
&OpenRanges
,
277 TransferMap
&Transfers
, VarLocMap
&VarLocIDs
,
278 unsigned OldVarID
, TransferKind Kind
,
279 unsigned NewReg
= 0);
281 void transferDebugValue(const MachineInstr
&MI
, OpenRangesSet
&OpenRanges
,
282 VarLocMap
&VarLocIDs
);
283 void transferSpillOrRestoreInst(MachineInstr
&MI
, OpenRangesSet
&OpenRanges
,
284 VarLocMap
&VarLocIDs
, TransferMap
&Transfers
);
285 void transferRegisterCopy(MachineInstr
&MI
, OpenRangesSet
&OpenRanges
,
286 VarLocMap
&VarLocIDs
, TransferMap
&Transfers
);
287 void transferRegisterDef(MachineInstr
&MI
, OpenRangesSet
&OpenRanges
,
288 const VarLocMap
&VarLocIDs
);
289 bool transferTerminatorInst(MachineInstr
&MI
, OpenRangesSet
&OpenRanges
,
290 VarLocInMBB
&OutLocs
, const VarLocMap
&VarLocIDs
);
291 bool process(MachineInstr
&MI
, OpenRangesSet
&OpenRanges
,
292 VarLocInMBB
&OutLocs
, VarLocMap
&VarLocIDs
,
293 TransferMap
&Transfers
, bool transferChanges
);
295 bool join(MachineBasicBlock
&MBB
, VarLocInMBB
&OutLocs
, VarLocInMBB
&InLocs
,
296 const VarLocMap
&VarLocIDs
,
297 SmallPtrSet
<const MachineBasicBlock
*, 16> &Visited
,
298 SmallPtrSetImpl
<const MachineBasicBlock
*> &ArtificialBlocks
);
300 bool ExtendRanges(MachineFunction
&MF
);
305 /// Default construct and initialize the pass.
308 /// Tell the pass manager which passes we depend on and what
309 /// information we preserve.
310 void getAnalysisUsage(AnalysisUsage
&AU
) const override
;
312 MachineFunctionProperties
getRequiredProperties() const override
{
313 return MachineFunctionProperties().set(
314 MachineFunctionProperties::Property::NoVRegs
);
317 /// Print to ostream with a message.
318 void printVarLocInMBB(const MachineFunction
&MF
, const VarLocInMBB
&V
,
319 const VarLocMap
&VarLocIDs
, const char *msg
,
320 raw_ostream
&Out
) const;
322 /// Calculate the liveness information for the given machine function.
323 bool runOnMachineFunction(MachineFunction
&MF
) override
;
326 } // end anonymous namespace
328 //===----------------------------------------------------------------------===//
330 //===----------------------------------------------------------------------===//
332 char LiveDebugValues::ID
= 0;
334 char &llvm::LiveDebugValuesID
= LiveDebugValues::ID
;
336 INITIALIZE_PASS(LiveDebugValues
, DEBUG_TYPE
, "Live DEBUG_VALUE analysis",
339 /// Default construct and initialize the pass.
340 LiveDebugValues::LiveDebugValues() : MachineFunctionPass(ID
) {
341 initializeLiveDebugValuesPass(*PassRegistry::getPassRegistry());
344 /// Tell the pass manager which passes we depend on and what information we
346 void LiveDebugValues::getAnalysisUsage(AnalysisUsage
&AU
) const {
347 AU
.setPreservesCFG();
348 MachineFunctionPass::getAnalysisUsage(AU
);
351 //===----------------------------------------------------------------------===//
352 // Debug Range Extension Implementation
353 //===----------------------------------------------------------------------===//
356 void LiveDebugValues::printVarLocInMBB(const MachineFunction
&MF
,
357 const VarLocInMBB
&V
,
358 const VarLocMap
&VarLocIDs
,
360 raw_ostream
&Out
) const {
361 Out
<< '\n' << msg
<< '\n';
362 for (const MachineBasicBlock
&BB
: MF
) {
363 const VarLocSet
&L
= V
.lookup(&BB
);
366 Out
<< "MBB: " << BB
.getNumber() << ":\n";
367 for (unsigned VLL
: L
) {
368 const VarLoc
&VL
= VarLocIDs
[VLL
];
369 Out
<< " Var: " << VL
.Var
.getVar()->getName();
378 LiveDebugValues::VarLoc::SpillLoc
379 LiveDebugValues::extractSpillBaseRegAndOffset(const MachineInstr
&MI
) {
380 assert(MI
.hasOneMemOperand() &&
381 "Spill instruction does not have exactly one memory operand?");
382 auto MMOI
= MI
.memoperands_begin();
383 const PseudoSourceValue
*PVal
= (*MMOI
)->getPseudoValue();
384 assert(PVal
->kind() == PseudoSourceValue::FixedStack
&&
385 "Inconsistent memory operand in spill instruction");
386 int FI
= cast
<FixedStackPseudoSourceValue
>(PVal
)->getFrameIndex();
387 const MachineBasicBlock
*MBB
= MI
.getParent();
389 int Offset
= TFI
->getFrameIndexReference(*MBB
->getParent(), FI
, Reg
);
390 return {Reg
, Offset
};
393 /// End all previous ranges related to @MI and start a new range from @MI
394 /// if it is a DBG_VALUE instr.
395 void LiveDebugValues::transferDebugValue(const MachineInstr
&MI
,
396 OpenRangesSet
&OpenRanges
,
397 VarLocMap
&VarLocIDs
) {
398 if (!MI
.isDebugValue())
400 const DILocalVariable
*Var
= MI
.getDebugVariable();
401 const DILocation
*DebugLoc
= MI
.getDebugLoc();
402 const DILocation
*InlinedAt
= DebugLoc
->getInlinedAt();
403 assert(Var
->isValidLocationForIntrinsic(DebugLoc
) &&
404 "Expected inlined-at fields to agree");
406 // End all previous ranges of Var.
407 DebugVariable
V(Var
, InlinedAt
);
410 // Add the VarLoc to OpenRanges from this DBG_VALUE.
411 // TODO: Currently handles DBG_VALUE which has only reg as location.
412 if (isDbgValueDescribedByReg(MI
)) {
414 unsigned ID
= VarLocIDs
.insert(VL
);
415 OpenRanges
.insert(ID
, VL
.Var
);
419 /// Create new TransferDebugPair and insert it in \p Transfers. The VarLoc
420 /// with \p OldVarID should be deleted form \p OpenRanges and replaced with
421 /// new VarLoc. If \p NewReg is different than default zero value then the
422 /// new location will be register location created by the copy like instruction,
423 /// otherwise it is variable's location on the stack.
424 void LiveDebugValues::insertTransferDebugPair(
425 MachineInstr
&MI
, OpenRangesSet
&OpenRanges
, TransferMap
&Transfers
,
426 VarLocMap
&VarLocIDs
, unsigned OldVarID
, TransferKind Kind
,
428 const MachineInstr
*DMI
= &VarLocIDs
[OldVarID
].MI
;
429 MachineFunction
*MF
= MI
.getParent()->getParent();
430 MachineInstr
*NewDMI
;
432 auto ProcessVarLoc
= [&MI
, &OpenRanges
, &Transfers
,
433 &VarLocIDs
](VarLoc
&VL
, MachineInstr
*NewDMI
) {
434 unsigned LocId
= VarLocIDs
.insert(VL
);
435 OpenRanges
.insert(LocId
, VL
.Var
);
436 // The newly created DBG_VALUE instruction NewDMI must be inserted after
437 // MI. Keep track of the pairing.
438 TransferDebugPair MIP
= {&MI
, NewDMI
};
439 Transfers
.push_back(MIP
);
442 // End all previous ranges of Var.
443 OpenRanges
.erase(VarLocIDs
[OldVarID
].Var
);
445 case TransferKind::TransferCopy
: {
447 "No register supplied when handling a copy of a debug value");
448 // Create a DBG_VALUE instruction to describe the Var in its new
449 // register location.
450 NewDMI
= BuildMI(*MF
, DMI
->getDebugLoc(), DMI
->getDesc(),
451 DMI
->isIndirectDebugValue(), NewReg
,
452 DMI
->getDebugVariable(), DMI
->getDebugExpression());
453 if (DMI
->isIndirectDebugValue())
454 NewDMI
->getOperand(1).setImm(DMI
->getOperand(1).getImm());
455 VarLoc
VL(*NewDMI
, LS
);
456 ProcessVarLoc(VL
, NewDMI
);
457 LLVM_DEBUG(dbgs() << "Creating DBG_VALUE inst for register copy: ";
458 NewDMI
->print(dbgs(), false, false, false, TII
));
461 case TransferKind::TransferSpill
: {
462 // Create a DBG_VALUE instruction to describe the Var in its spilled
464 VarLoc::SpillLoc SpillLocation
= extractSpillBaseRegAndOffset(MI
);
466 DIExpression::prepend(DMI
->getDebugExpression(), DIExpression::NoDeref
,
467 SpillLocation
.SpillOffset
);
469 BuildMI(*MF
, DMI
->getDebugLoc(), DMI
->getDesc(), true,
470 SpillLocation
.SpillBase
, DMI
->getDebugVariable(), SpillExpr
);
471 VarLoc
VL(*NewDMI
, SpillLocation
.SpillBase
, SpillLocation
.SpillOffset
, LS
);
472 ProcessVarLoc(VL
, NewDMI
);
473 LLVM_DEBUG(dbgs() << "Creating DBG_VALUE inst for spill: ";
474 NewDMI
->print(dbgs(), false, false, false, TII
));
477 case TransferKind::TransferRestore
: {
479 "No register supplied when handling a restore of a debug value");
480 MachineFunction
*MF
= MI
.getMF();
481 DIBuilder
DIB(*const_cast<Function
&>(MF
->getFunction()).getParent());
482 NewDMI
= BuildMI(*MF
, DMI
->getDebugLoc(), DMI
->getDesc(), false, NewReg
,
483 DMI
->getDebugVariable(), DIB
.createExpression());
484 VarLoc
VL(*NewDMI
, LS
);
485 ProcessVarLoc(VL
, NewDMI
);
486 LLVM_DEBUG(dbgs() << "Creating DBG_VALUE inst for register restore: ";
487 NewDMI
->print(dbgs(), false, false, false, TII
));
491 llvm_unreachable("Invalid transfer kind");
494 /// A definition of a register may mark the end of a range.
495 void LiveDebugValues::transferRegisterDef(MachineInstr
&MI
,
496 OpenRangesSet
&OpenRanges
,
497 const VarLocMap
&VarLocIDs
) {
498 MachineFunction
*MF
= MI
.getMF();
499 const TargetLowering
*TLI
= MF
->getSubtarget().getTargetLowering();
500 unsigned SP
= TLI
->getStackPointerRegisterToSaveRestore();
501 SparseBitVector
<> KillSet
;
502 for (const MachineOperand
&MO
: MI
.operands()) {
503 // Determine whether the operand is a register def. Assume that call
504 // instructions never clobber SP, because some backends (e.g., AArch64)
505 // never list SP in the regmask.
506 if (MO
.isReg() && MO
.isDef() && MO
.getReg() &&
507 TRI
->isPhysicalRegister(MO
.getReg()) &&
508 !(MI
.isCall() && MO
.getReg() == SP
)) {
509 // Remove ranges of all aliased registers.
510 for (MCRegAliasIterator
RAI(MO
.getReg(), TRI
, true); RAI
.isValid(); ++RAI
)
511 for (unsigned ID
: OpenRanges
.getVarLocs())
512 if (VarLocIDs
[ID
].isDescribedByReg() == *RAI
)
514 } else if (MO
.isRegMask()) {
515 // Remove ranges of all clobbered registers. Register masks don't usually
516 // list SP as preserved. While the debug info may be off for an
517 // instruction or two around callee-cleanup calls, transferring the
518 // DEBUG_VALUE across the call is still a better user experience.
519 for (unsigned ID
: OpenRanges
.getVarLocs()) {
520 unsigned Reg
= VarLocIDs
[ID
].isDescribedByReg();
521 if (Reg
&& Reg
!= SP
&& MO
.clobbersPhysReg(Reg
))
526 OpenRanges
.erase(KillSet
, VarLocIDs
);
529 /// Decide if @MI is a spill instruction and return true if it is. We use 2
530 /// criteria to make this decision:
531 /// - Is this instruction a store to a spill slot?
532 /// - Is there a register operand that is both used and killed?
533 /// TODO: Store optimization can fold spills into other stores (including
534 /// other spills). We do not handle this yet (more than one memory operand).
535 bool LiveDebugValues::isSpillInstruction(const MachineInstr
&MI
,
536 MachineFunction
*MF
, unsigned &Reg
) {
537 SmallVector
<const MachineMemOperand
*, 1> Accesses
;
539 // TODO: Handle multiple stores folded into one.
540 if (!MI
.hasOneMemOperand())
543 if (!MI
.getSpillSize(TII
) && !MI
.getFoldedSpillSize(TII
))
544 return false; // This is not a spill instruction, since no valid size was
545 // returned from either function.
547 auto isKilledReg
= [&](const MachineOperand MO
, unsigned &Reg
) {
548 if (!MO
.isReg() || !MO
.isUse()) {
556 for (const MachineOperand
&MO
: MI
.operands()) {
557 // In a spill instruction generated by the InlineSpiller the spilled
558 // register has its kill flag set.
559 if (isKilledReg(MO
, Reg
))
562 // Check whether next instruction kills the spilled register.
563 // FIXME: Current solution does not cover search for killed register in
564 // bundles and instructions further down the chain.
565 auto NextI
= std::next(MI
.getIterator());
566 // Skip next instruction that points to basic block end iterator.
567 if (MI
.getParent()->end() == NextI
)
570 for (const MachineOperand
&MONext
: NextI
->operands()) {
571 // Return true if we came across the register from the
572 // previous spill instruction that is killed in NextI.
573 if (isKilledReg(MONext
, RegNext
) && RegNext
== Reg
)
578 // Return false if we didn't find spilled register.
582 Optional
<LiveDebugValues::VarLoc::SpillLoc
>
583 LiveDebugValues::isRestoreInstruction(const MachineInstr
&MI
,
584 MachineFunction
*MF
, unsigned &Reg
) {
585 if (!MI
.hasOneMemOperand())
588 // FIXME: Handle folded restore instructions with more than one memory
590 if (MI
.getRestoreSize(TII
)) {
591 Reg
= MI
.getOperand(0).getReg();
592 return extractSpillBaseRegAndOffset(MI
);
597 /// A spilled register may indicate that we have to end the current range of
598 /// a variable and create a new one for the spill location.
599 /// A restored register may indicate the reverse situation.
600 /// We don't want to insert any instructions in process(), so we just create
601 /// the DBG_VALUE without inserting it and keep track of it in \p Transfers.
602 /// It will be inserted into the BB when we're done iterating over the
604 void LiveDebugValues::transferSpillOrRestoreInst(MachineInstr
&MI
,
605 OpenRangesSet
&OpenRanges
,
606 VarLocMap
&VarLocIDs
,
607 TransferMap
&Transfers
) {
608 MachineFunction
*MF
= MI
.getMF();
611 Optional
<VarLoc::SpillLoc
> Loc
;
613 LLVM_DEBUG(dbgs() << "Examining instruction: "; MI
.dump(););
615 if (isSpillInstruction(MI
, MF
, Reg
)) {
616 TKind
= TransferKind::TransferSpill
;
617 LLVM_DEBUG(dbgs() << "Recognized as spill: "; MI
.dump(););
618 LLVM_DEBUG(dbgs() << "Register: " << Reg
<< " " << printReg(Reg
, TRI
)
621 if (!(Loc
= isRestoreInstruction(MI
, MF
, Reg
)))
623 TKind
= TransferKind::TransferRestore
;
624 LLVM_DEBUG(dbgs() << "Recognized as restore: "; MI
.dump(););
625 LLVM_DEBUG(dbgs() << "Register: " << Reg
<< " " << printReg(Reg
, TRI
)
628 // Check if the register or spill location is the location of a debug value.
629 for (unsigned ID
: OpenRanges
.getVarLocs()) {
630 if (TKind
== TransferKind::TransferSpill
&&
631 VarLocIDs
[ID
].isDescribedByReg() == Reg
) {
632 LLVM_DEBUG(dbgs() << "Spilling Register " << printReg(Reg
, TRI
) << '('
633 << VarLocIDs
[ID
].Var
.getVar()->getName() << ")\n");
634 } else if (TKind
== TransferKind::TransferRestore
&&
635 VarLocIDs
[ID
].Loc
.SpillLocation
== *Loc
) {
636 LLVM_DEBUG(dbgs() << "Restoring Register " << printReg(Reg
, TRI
) << '('
637 << VarLocIDs
[ID
].Var
.getVar()->getName() << ")\n");
640 insertTransferDebugPair(MI
, OpenRanges
, Transfers
, VarLocIDs
, ID
, TKind
,
646 /// If \p MI is a register copy instruction, that copies a previously tracked
647 /// value from one register to another register that is callee saved, we
648 /// create new DBG_VALUE instruction described with copy destination register.
649 void LiveDebugValues::transferRegisterCopy(MachineInstr
&MI
,
650 OpenRangesSet
&OpenRanges
,
651 VarLocMap
&VarLocIDs
,
652 TransferMap
&Transfers
) {
653 const MachineOperand
*SrcRegOp
, *DestRegOp
;
655 if (!TII
->isCopyInstr(MI
, SrcRegOp
, DestRegOp
) || !SrcRegOp
->isKill() ||
659 auto isCalleSavedReg
= [&](unsigned Reg
) {
660 for (MCRegAliasIterator
RAI(Reg
, TRI
, true); RAI
.isValid(); ++RAI
)
661 if (CalleeSavedRegs
.test(*RAI
))
666 unsigned SrcReg
= SrcRegOp
->getReg();
667 unsigned DestReg
= DestRegOp
->getReg();
669 // We want to recognize instructions where destination register is callee
670 // saved register. If register that could be clobbered by the call is
671 // included, there would be a great chance that it is going to be clobbered
672 // soon. It is more likely that previous register location, which is callee
673 // saved, is going to stay unclobbered longer, even if it is killed.
674 if (!isCalleSavedReg(DestReg
))
677 for (unsigned ID
: OpenRanges
.getVarLocs()) {
678 if (VarLocIDs
[ID
].isDescribedByReg() == SrcReg
) {
679 insertTransferDebugPair(MI
, OpenRanges
, Transfers
, VarLocIDs
, ID
,
680 TransferKind::TransferCopy
, DestReg
);
686 /// Terminate all open ranges at the end of the current basic block.
687 bool LiveDebugValues::transferTerminatorInst(MachineInstr
&MI
,
688 OpenRangesSet
&OpenRanges
,
689 VarLocInMBB
&OutLocs
,
690 const VarLocMap
&VarLocIDs
) {
691 bool Changed
= false;
692 const MachineBasicBlock
*CurMBB
= MI
.getParent();
693 if (!(MI
.isTerminator() || (&MI
== &CurMBB
->back())))
696 if (OpenRanges
.empty())
699 LLVM_DEBUG(for (unsigned ID
700 : OpenRanges
.getVarLocs()) {
701 // Copy OpenRanges to OutLocs, if not already present.
702 dbgs() << "Add to OutLocs in MBB #" << CurMBB
->getNumber() << ": ";
703 VarLocIDs
[ID
].dump();
705 VarLocSet
&VLS
= OutLocs
[CurMBB
];
706 Changed
= VLS
|= OpenRanges
.getVarLocs();
711 /// This routine creates OpenRanges and OutLocs.
712 bool LiveDebugValues::process(MachineInstr
&MI
, OpenRangesSet
&OpenRanges
,
713 VarLocInMBB
&OutLocs
, VarLocMap
&VarLocIDs
,
714 TransferMap
&Transfers
, bool transferChanges
) {
715 bool Changed
= false;
716 transferDebugValue(MI
, OpenRanges
, VarLocIDs
);
717 transferRegisterDef(MI
, OpenRanges
, VarLocIDs
);
718 if (transferChanges
) {
719 transferRegisterCopy(MI
, OpenRanges
, VarLocIDs
, Transfers
);
720 transferSpillOrRestoreInst(MI
, OpenRanges
, VarLocIDs
, Transfers
);
722 Changed
= transferTerminatorInst(MI
, OpenRanges
, OutLocs
, VarLocIDs
);
726 /// This routine joins the analysis results of all incoming edges in @MBB by
727 /// inserting a new DBG_VALUE instruction at the start of the @MBB - if the same
728 /// source variable in all the predecessors of @MBB reside in the same location.
729 bool LiveDebugValues::join(
730 MachineBasicBlock
&MBB
, VarLocInMBB
&OutLocs
, VarLocInMBB
&InLocs
,
731 const VarLocMap
&VarLocIDs
,
732 SmallPtrSet
<const MachineBasicBlock
*, 16> &Visited
,
733 SmallPtrSetImpl
<const MachineBasicBlock
*> &ArtificialBlocks
) {
734 LLVM_DEBUG(dbgs() << "join MBB: " << MBB
.getNumber() << "\n");
735 bool Changed
= false;
737 VarLocSet InLocsT
; // Temporary incoming locations.
739 // For all predecessors of this MBB, find the set of VarLocs that
742 for (auto p
: MBB
.predecessors()) {
743 // Ignore unvisited predecessor blocks. As we are processing
744 // the blocks in reverse post-order any unvisited block can
745 // be considered to not remove any incoming values.
746 if (!Visited
.count(p
)) {
747 LLVM_DEBUG(dbgs() << " ignoring unvisited pred MBB: " << p
->getNumber()
751 auto OL
= OutLocs
.find(p
);
752 // Join is null in case of empty OutLocs from any of the pred.
753 if (OL
== OutLocs
.end())
756 // Just copy over the Out locs to incoming locs for the first visited
757 // predecessor, and for all other predecessors join the Out locs.
759 InLocsT
= OL
->second
;
761 InLocsT
&= OL
->second
;
764 if (!InLocsT
.empty()) {
765 for (auto ID
: InLocsT
)
766 dbgs() << " gathered candidate incoming var: "
767 << VarLocIDs
[ID
].Var
.getVar()->getName() << "\n";
774 // Filter out DBG_VALUES that are out of scope.
776 bool IsArtificial
= ArtificialBlocks
.count(&MBB
);
778 for (auto ID
: InLocsT
) {
779 if (!VarLocIDs
[ID
].dominates(MBB
)) {
782 auto Name
= VarLocIDs
[ID
].Var
.getVar()->getName();
783 dbgs() << " killing " << Name
<< ", it doesn't dominate MBB\n";
788 InLocsT
.intersectWithComplement(KillSet
);
790 // As we are processing blocks in reverse post-order we
791 // should have processed at least one predecessor, unless it
792 // is the entry block which has no predecessor.
793 assert((NumVisited
|| MBB
.pred_empty()) &&
794 "Should have processed at least one predecessor");
798 VarLocSet
&ILS
= InLocs
[&MBB
];
800 // Insert DBG_VALUE instructions, if not already inserted.
801 VarLocSet Diff
= InLocsT
;
802 Diff
.intersectWithComplement(ILS
);
803 for (auto ID
: Diff
) {
804 // This VarLoc is not found in InLocs i.e. it is not yet inserted. So, a
805 // new range is started for the var from the mbb's beginning by inserting
806 // a new DBG_VALUE. process() will end this range however appropriate.
807 const VarLoc
&DiffIt
= VarLocIDs
[ID
];
808 const MachineInstr
*DMI
= &DiffIt
.MI
;
810 BuildMI(MBB
, MBB
.instr_begin(), DMI
->getDebugLoc(), DMI
->getDesc(),
811 DMI
->isIndirectDebugValue(), DMI
->getOperand(0).getReg(),
812 DMI
->getDebugVariable(), DMI
->getDebugExpression());
813 if (DMI
->isIndirectDebugValue())
814 MI
->getOperand(1).setImm(DMI
->getOperand(1).getImm());
815 LLVM_DEBUG(dbgs() << "Inserted: "; MI
->dump(););
823 /// Calculate the liveness information for the given machine function and
824 /// extend ranges across basic blocks.
825 bool LiveDebugValues::ExtendRanges(MachineFunction
&MF
) {
826 LLVM_DEBUG(dbgs() << "\nDebug Range Extension\n");
828 bool Changed
= false;
829 bool OLChanged
= false;
830 bool MBBJoined
= false;
832 VarLocMap VarLocIDs
; // Map VarLoc<>unique ID for use in bitvectors.
833 OpenRangesSet OpenRanges
; // Ranges that are open until end of bb.
834 VarLocInMBB OutLocs
; // Ranges that exist beyond bb.
835 VarLocInMBB InLocs
; // Ranges that are incoming after joining.
836 TransferMap Transfers
; // DBG_VALUEs associated with spills.
838 // Blocks which are artificial, i.e. blocks which exclusively contain
839 // instructions without locations, or with line 0 locations.
840 SmallPtrSet
<const MachineBasicBlock
*, 16> ArtificialBlocks
;
842 DenseMap
<unsigned int, MachineBasicBlock
*> OrderToBB
;
843 DenseMap
<MachineBasicBlock
*, unsigned int> BBToOrder
;
844 std::priority_queue
<unsigned int, std::vector
<unsigned int>,
845 std::greater
<unsigned int>>
847 std::priority_queue
<unsigned int, std::vector
<unsigned int>,
848 std::greater
<unsigned int>>
851 enum : bool { dontTransferChanges
= false, transferChanges
= true };
853 // Initialize every mbb with OutLocs.
854 // We are not looking at any spill instructions during the initial pass
855 // over the BBs. The LiveDebugVariables pass has already created DBG_VALUE
856 // instructions for spills of registers that are known to be user variables
857 // within the BB in which the spill occurs.
860 process(MI
, OpenRanges
, OutLocs
, VarLocIDs
, Transfers
,
861 dontTransferChanges
);
863 auto hasNonArtificialLocation
= [](const MachineInstr
&MI
) -> bool {
864 if (const DebugLoc
&DL
= MI
.getDebugLoc())
865 return DL
.getLine() != 0;
869 if (none_of(MBB
.instrs(), hasNonArtificialLocation
))
870 ArtificialBlocks
.insert(&MBB
);
872 LLVM_DEBUG(printVarLocInMBB(MF
, OutLocs
, VarLocIDs
,
873 "OutLocs after initialization", dbgs()));
875 ReversePostOrderTraversal
<MachineFunction
*> RPOT(&MF
);
876 unsigned int RPONumber
= 0;
877 for (auto RI
= RPOT
.begin(), RE
= RPOT
.end(); RI
!= RE
; ++RI
) {
878 OrderToBB
[RPONumber
] = *RI
;
879 BBToOrder
[*RI
] = RPONumber
;
880 Worklist
.push(RPONumber
);
883 // This is a standard "union of predecessor outs" dataflow problem.
884 // To solve it, we perform join() and process() using the two worklist method
885 // until the ranges converge.
886 // Ranges have converged when both worklists are empty.
887 SmallPtrSet
<const MachineBasicBlock
*, 16> Visited
;
888 while (!Worklist
.empty() || !Pending
.empty()) {
889 // We track what is on the pending worklist to avoid inserting the same
890 // thing twice. We could avoid this with a custom priority queue, but this
891 // is probably not worth it.
892 SmallPtrSet
<MachineBasicBlock
*, 16> OnPending
;
893 LLVM_DEBUG(dbgs() << "Processing Worklist\n");
894 while (!Worklist
.empty()) {
895 MachineBasicBlock
*MBB
= OrderToBB
[Worklist
.top()];
898 join(*MBB
, OutLocs
, InLocs
, VarLocIDs
, Visited
, ArtificialBlocks
);
903 // Now that we have started to extend ranges across BBs we need to
904 // examine spill instructions to see whether they spill registers that
905 // correspond to user variables.
906 for (auto &MI
: *MBB
)
907 OLChanged
|= process(MI
, OpenRanges
, OutLocs
, VarLocIDs
, Transfers
,
910 // Add any DBG_VALUE instructions necessitated by spills.
911 for (auto &TR
: Transfers
)
912 MBB
->insertAfter(MachineBasicBlock::iterator(*TR
.TransferInst
),
916 LLVM_DEBUG(printVarLocInMBB(MF
, OutLocs
, VarLocIDs
,
917 "OutLocs after propagating", dbgs()));
918 LLVM_DEBUG(printVarLocInMBB(MF
, InLocs
, VarLocIDs
,
919 "InLocs after propagating", dbgs()));
923 for (auto s
: MBB
->successors())
924 if (OnPending
.insert(s
).second
) {
925 Pending
.push(BBToOrder
[s
]);
930 Worklist
.swap(Pending
);
931 // At this point, pending must be empty, since it was just the empty
933 assert(Pending
.empty() && "Pending should be empty");
936 LLVM_DEBUG(printVarLocInMBB(MF
, OutLocs
, VarLocIDs
, "Final OutLocs", dbgs()));
937 LLVM_DEBUG(printVarLocInMBB(MF
, InLocs
, VarLocIDs
, "Final InLocs", dbgs()));
941 bool LiveDebugValues::runOnMachineFunction(MachineFunction
&MF
) {
942 if (!MF
.getFunction().getSubprogram())
943 // LiveDebugValues will already have removed all DBG_VALUEs.
946 // Skip functions from NoDebug compilation units.
947 if (MF
.getFunction().getSubprogram()->getUnit()->getEmissionKind() ==
948 DICompileUnit::NoDebug
)
951 TRI
= MF
.getSubtarget().getRegisterInfo();
952 TII
= MF
.getSubtarget().getInstrInfo();
953 TFI
= MF
.getSubtarget().getFrameLowering();
954 TFI
->determineCalleeSaves(MF
, CalleeSavedRegs
,
955 make_unique
<RegScavenger
>().get());
958 bool Changed
= ExtendRanges(MF
);