1bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen//===- LiveDebugVariables.cpp - Tracking debug info variables -------------===//
2bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen//
3bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen//                     The LLVM Compiler Infrastructure
4bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen//
5bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// This file is distributed under the University of Illinois Open Source
6bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// License. See LICENSE.TXT for details.
7bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen//
8bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen//===----------------------------------------------------------------------===//
9bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen//
10bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// This file implements the LiveDebugVariables analysis.
11bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen//
12bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// Remove all DBG_VALUE instructions referencing virtual registers and replace
13bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// them with a data structure tracking where live user variables are kept - in a
14bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// virtual register or in a stack slot.
15bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen//
16bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// Allow the data structure to be updated during register allocation when values
17bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// are moved between registers and stack slots. Finally emit new DBG_VALUE
18bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// instructions after register allocation is complete.
19bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen//
20bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen//===----------------------------------------------------------------------===//
21bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen
22bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen#include "LiveDebugVariables.h"
230613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#include "llvm/ADT/IntervalMap.h"
24ad90d3a343ca73c32693e2b05b74462ccd9659cdDevang Patel#include "llvm/ADT/Statistic.h"
25c722c3d5ffd4ad07e17f81c2b2eb7f8074559600Devang Patel#include "llvm/CodeGen/LexicalScopes.h"
26bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen#include "llvm/CodeGen/LiveIntervalAnalysis.h"
270613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#include "llvm/CodeGen/MachineDominators.h"
2842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen#include "llvm/CodeGen/MachineFunction.h"
2942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen#include "llvm/CodeGen/MachineInstrBuilder.h"
301744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen#include "llvm/CodeGen/MachineRegisterInfo.h"
31bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen#include "llvm/CodeGen/Passes.h"
321ead68d769f27f6d68d4aaeffe4199fa2cacbc95Jakob Stoklund Olesen#include "llvm/CodeGen/VirtRegMap.h"
330b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constants.h"
3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/DebugInfo.h"
350b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Metadata.h"
360b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Value.h"
370613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#include "llvm/Support/CommandLine.h"
380613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#include "llvm/Support/Debug.h"
394c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/Support/raw_ostream.h"
4042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen#include "llvm/Target/TargetInstrInfo.h"
41bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen#include "llvm/Target/TargetMachine.h"
420613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#include "llvm/Target/TargetRegisterInfo.h"
4337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/Target/TargetSubtargetInfo.h"
44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include <memory>
45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
46bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesenusing namespace llvm;
47bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen
48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "livedebug"
49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
5051a666f0e50a34b74212db9c5814153c885153a5Devang Patelstatic cl::opt<bool>
5125dc2268a5aedcb5da57f065dbdb40d790b11bc0Jakob Stoklund OlesenEnableLDV("live-debug-variables", cl::init(true),
5251a666f0e50a34b74212db9c5814153c885153a5Devang Patel          cl::desc("Enable the live debug variables pass"), cl::Hidden);
5351a666f0e50a34b74212db9c5814153c885153a5Devang Patel
54ad90d3a343ca73c32693e2b05b74462ccd9659cdDevang PatelSTATISTIC(NumInsertedDebugValues, "Number of DBG_VALUEs inserted");
55bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesenchar LiveDebugVariables::ID = 0;
56bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen
57bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund OlesenINITIALIZE_PASS_BEGIN(LiveDebugVariables, "livedebugvars",
58bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen                "Debug Variable Analysis", false, false)
590613516b16466a92c68d60734801221506c85e86Jakob Stoklund OlesenINITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
60bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund OlesenINITIALIZE_PASS_DEPENDENCY(LiveIntervals)
61bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund OlesenINITIALIZE_PASS_END(LiveDebugVariables, "livedebugvars",
62bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen                "Debug Variable Analysis", false, false)
63bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen
64bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesenvoid LiveDebugVariables::getAnalysisUsage(AnalysisUsage &AU) const {
650613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  AU.addRequired<MachineDominatorTree>();
66bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen  AU.addRequiredTransitive<LiveIntervals>();
67bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen  AU.setPreservesAll();
68bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen  MachineFunctionPass::getAnalysisUsage(AU);
69bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen}
70bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen
71dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesLiveDebugVariables::LiveDebugVariables() : MachineFunctionPass(ID), pImpl(nullptr) {
72bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen  initializeLiveDebugVariablesPass(*PassRegistry::getPassRegistry());
73bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen}
74bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen
750613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// LocMap - Map of where a user value is live, and its location.
760613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesentypedef IntervalMap<SlotIndex, unsigned, 4> LocMap;
770613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
7876f58d20313a23758399a59ceec0fbc6c2c16397Benjamin Kramernamespace {
7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// UserValueScopes - Keeps track of lexical scopes associated with a
803a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patel/// user value's source location.
813a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patelclass UserValueScopes {
823a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patel  DebugLoc DL;
833a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patel  LexicalScopes &LS;
843a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patel  SmallPtrSet<const MachineBasicBlock *, 4> LBlocks;
853a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patel
863a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patelpublic:
873a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patel  UserValueScopes(DebugLoc D, LexicalScopes &L) : DL(D), LS(L) {}
883a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patel
893a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patel  /// dominates - Return true if current scope dominates at least one machine
903a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patel  /// instruction in a given machine basic block.
913a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patel  bool dominates(MachineBasicBlock *MBB) {
923a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patel    if (LBlocks.empty())
933a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patel      LS.getMachineBasicBlocks(DL, LBlocks);
943a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patel    if (LBlocks.count(MBB) != 0 || LS.dominates(DL, MBB))
953a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patel      return true;
963a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patel    return false;
973a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patel  }
983a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patel};
9976f58d20313a23758399a59ceec0fbc6c2c16397Benjamin Kramer} // end anonymous namespace
1003a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patel
1010613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// UserValue - A user value is a part of a debug info user variable.
1020613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen///
1030613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// A DBG_VALUE instruction notes that (a sub-register of) a virtual register
1040613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// holds part of a user variable. The part is identified by a byte offset.
1050613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen///
1060613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// UserValues are grouped into equivalence classes for easier searching. Two
1070613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// user values are related if they refer to the same variable, or if they are
1080613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// held by the same virtual register. The equivalence class is the transitive
1090613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// closure of that relation.
1100613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesennamespace {
1111744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesenclass LDVImpl;
1120613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenclass UserValue {
11337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  const MDNode *Variable;   ///< The debug info variable we are part of.
11437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  const MDNode *Expression; ///< Any complex address expression.
1150613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  unsigned offset;        ///< Byte offset into variable.
1163517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl  bool IsIndirect;        ///< true if this is a register-indirect+offset value.
117f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel  DebugLoc dl;            ///< The debug location for the variable. This is
118f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel                          ///< used by dwarf writer to find lexical scope.
1190613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  UserValue *leader;      ///< Equivalence class leader.
1200613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  UserValue *next;        ///< Next value in equivalence class, or null.
1210613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
1220613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// Numbered locations referenced by locmap.
1230804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  SmallVector<MachineOperand, 4> locations;
1240613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
1250613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// Map of slot indices where this value is live.
1260613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  LocMap locInts;
1270613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
1285daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  /// coalesceLocation - After LocNo was changed, check if it has become
1295daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  /// identical to another location, and coalesce them. This may cause LocNo or
1305daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  /// a later location to be erased, but no earlier location will be erased.
1315daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  void coalesceLocation(unsigned LocNo);
1325daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen
13342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  /// insertDebugValue - Insert a DBG_VALUE into MBB at Idx for LocNo.
13442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  void insertDebugValue(MachineBasicBlock *MBB, SlotIndex Idx, unsigned LocNo,
13542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen                        LiveIntervals &LIS, const TargetInstrInfo &TII);
13642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
137f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  /// splitLocation - Replace OldLocNo ranges with NewRegs ranges where NewRegs
138f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  /// is live. Returns true if any changes were made.
1391feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey  bool splitLocation(unsigned OldLocNo, ArrayRef<unsigned> NewRegs,
1401feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey                     LiveIntervals &LIS);
141f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
1420613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenpublic:
1430613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// UserValue - Create a new UserValue.
14437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  UserValue(const MDNode *var, const MDNode *expr, unsigned o, bool i,
14537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines            DebugLoc L, LocMap::Allocator &alloc)
14637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      : Variable(var), Expression(expr), offset(o), IsIndirect(i), dl(L),
14737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        leader(this), next(nullptr), locInts(alloc) {}
1480613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
1490613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// getLeader - Get the leader of this value's equivalence class.
1500613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  UserValue *getLeader() {
1510613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    UserValue *l = leader;
1520613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    while (l != l->leader)
1530613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      l = l->leader;
1540613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    return leader = l;
1550613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
1560613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
1570613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// getNext - Return the next UserValue in the equivalence class.
1580613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  UserValue *getNext() const { return next; }
1590613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
160a462d6e8ebe90f3732891b02a057a88038ac1228Devang Patel  /// match - Does this UserValue match the parameters?
1612c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  bool match(const MDNode *Var, const MDNode *Expr, const MDLocation *IA,
1622c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar             unsigned Offset, bool indirect) const {
1632c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    return Var == Variable && Expr == Expression && dl->getInlinedAt() == IA &&
1642c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar           Offset == offset && indirect == IsIndirect;
1650613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
1660613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
1670613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// merge - Merge equivalence classes.
1680613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  static UserValue *merge(UserValue *L1, UserValue *L2) {
1690613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    L2 = L2->getLeader();
1700613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (!L1)
1710613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      return L2;
1720613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    L1 = L1->getLeader();
1730613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (L1 == L2)
1740613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      return L1;
1750613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    // Splice L2 before L1's members.
1760613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    UserValue *End = L2;
1770613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    while (End->next)
1780613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      End->leader = L1, End = End->next;
1790613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    End->leader = L1;
1800613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    End->next = L1->next;
1810613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    L1->next = L2;
1820613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    return L1;
1830613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
1840613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
1850613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// getLocationNo - Return the location number that matches Loc.
1860804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  unsigned getLocationNo(const MachineOperand &LocMO) {
1871744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    if (LocMO.isReg()) {
1881744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      if (LocMO.getReg() == 0)
1891744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen        return ~0u;
1901744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      // For register locations we dont care about use/def and other flags.
1911744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      for (unsigned i = 0, e = locations.size(); i != e; ++i)
1921744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen        if (locations[i].isReg() &&
1931744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen            locations[i].getReg() == LocMO.getReg() &&
1941744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen            locations[i].getSubReg() == LocMO.getSubReg())
1951744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen          return i;
1961744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    } else
1971744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      for (unsigned i = 0, e = locations.size(); i != e; ++i)
1981744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen        if (LocMO.isIdenticalTo(locations[i]))
1991744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen          return i;
2000804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    locations.push_back(LocMO);
2010804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    // We are storing a MachineOperand outside a MachineInstr.
2020804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    locations.back().clearParent();
2031744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    // Don't store def operands.
2041744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    if (locations.back().isReg())
2051744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      locations.back().setIsUse();
2060804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    return locations.size() - 1;
2070613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
2080613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2091744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  /// mapVirtRegs - Ensure that all virtual register locations are mapped.
2101744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  void mapVirtRegs(LDVImpl *LDV);
2111744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen
2120613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// addDef - Add a definition point to this value.
2130613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  void addDef(SlotIndex Idx, const MachineOperand &LocMO) {
2140613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    // Add a singular (Idx,Idx) -> Loc mapping.
2150613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    LocMap::iterator I = locInts.find(Idx);
2160613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (!I.valid() || I.start() != Idx)
2170613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      I.insert(Idx, Idx.getNextSlot(), getLocationNo(LocMO));
21879513ed8598bd5ebc25b0764961f326d34aaf388Jakob Stoklund Olesen    else
21979513ed8598bd5ebc25b0764961f326d34aaf388Jakob Stoklund Olesen      // A later DBG_VALUE at the same SlotIndex overrides the old location.
22079513ed8598bd5ebc25b0764961f326d34aaf388Jakob Stoklund Olesen      I.setValue(getLocationNo(LocMO));
2210613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
2220613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2230613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// extendDef - Extend the current definition as far as possible down the
2240613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// dominator tree. Stop when meeting an existing def or when leaving the live
2250613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// range of VNI.
2261744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  /// End points where VNI is no longer live are added to Kills.
2270613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @param Idx   Starting point for the definition.
2280613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @param LocNo Location number to propagate.
2294f3b5e8c9232e43d1291aab8db5f5698d7ee0ea4Matthias Braun  /// @param LR    Restrict liveness to where LR has the value VNI. May be null.
2304f3b5e8c9232e43d1291aab8db5f5698d7ee0ea4Matthias Braun  /// @param VNI   When LR is not null, this is the value to restrict to.
2311744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  /// @param Kills Append end points of VNI's live range to Kills.
2320613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @param LIS   Live intervals analysis.
2330613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @param MDT   Dominator tree.
2340613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  void extendDef(SlotIndex Idx, unsigned LocNo,
2354f3b5e8c9232e43d1291aab8db5f5698d7ee0ea4Matthias Braun                 LiveRange *LR, const VNInfo *VNI,
2361744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen                 SmallVectorImpl<SlotIndex> *Kills,
237c722c3d5ffd4ad07e17f81c2b2eb7f8074559600Devang Patel                 LiveIntervals &LIS, MachineDominatorTree &MDT,
238b82062f65265666690270f3358b0d0f508d3fbbaEric Christopher                 UserValueScopes &UVS);
2390613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2401744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  /// addDefsFromCopies - The value in LI/LocNo may be copies to other
2411744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  /// registers. Determine if any of the copies are available at the kill
2421744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  /// points, and add defs if possible.
2431744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  /// @param LI      Scan for copies of the value in LI->reg.
2441744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  /// @param LocNo   Location number of LI->reg.
2451744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  /// @param Kills   Points where the range of LocNo could be extended.
2461744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  /// @param NewDefs Append (Idx, LocNo) of inserted defs here.
2471744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  void addDefsFromCopies(LiveInterval *LI, unsigned LocNo,
2481744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen                      const SmallVectorImpl<SlotIndex> &Kills,
2491744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen                      SmallVectorImpl<std::pair<SlotIndex, unsigned> > &NewDefs,
2501744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen                      MachineRegisterInfo &MRI,
2511744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen                      LiveIntervals &LIS);
2521744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen
2530613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// computeIntervals - Compute the live intervals of all locations after
2540613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// collecting all their def points.
255e8a0a1286417e73f4b2bffe21ae45882701e703fJakob Stoklund Olesen  void computeIntervals(MachineRegisterInfo &MRI, const TargetRegisterInfo &TRI,
256c722c3d5ffd4ad07e17f81c2b2eb7f8074559600Devang Patel                        LiveIntervals &LIS, MachineDominatorTree &MDT,
2573a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patel                        UserValueScopes &UVS);
2580613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
259f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  /// splitRegister - Replace OldReg ranges with NewRegs ranges where NewRegs is
260f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  /// live. Returns true if any changes were made.
2611feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey  bool splitRegister(unsigned OldLocNo, ArrayRef<unsigned> NewRegs,
2621feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey                     LiveIntervals &LIS);
263f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
26442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  /// rewriteLocations - Rewrite virtual register locations according to the
26542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  /// provided virtual register map.
26642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  void rewriteLocations(VirtRegMap &VRM, const TargetRegisterInfo &TRI);
26742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
268b3cecdfcf9a0b736d3c0f6f5abffb41ecda3577cEric Christopher  /// emitDebugValues - Recreate DBG_VALUE instruction from data structures.
26942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  void emitDebugValues(VirtRegMap *VRM,
27042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen                       LiveIntervals &LIS, const TargetInstrInfo &TRI);
27142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
2723a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patel  /// getDebugLoc - Return DebugLoc of this UserValue.
2733a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patel  DebugLoc getDebugLoc() { return dl;}
2744c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void print(raw_ostream &, const TargetRegisterInfo *);
2750613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen};
2760613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen} // namespace
2770613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2780613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// LDVImpl - Implementation of the LiveDebugVariables pass.
2790613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesennamespace {
2800613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenclass LDVImpl {
2810613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  LiveDebugVariables &pass;
2820613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  LocMap::Allocator allocator;
2830613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  MachineFunction *MF;
2840613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  LiveIntervals *LIS;
285c722c3d5ffd4ad07e17f81c2b2eb7f8074559600Devang Patel  LexicalScopes LS;
2860613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  MachineDominatorTree *MDT;
2870613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  const TargetRegisterInfo *TRI;
2880613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
289f098620095727dd2a823a94a3a8d47108361ad83Manman Ren  /// Whether emitDebugValues is called.
290f098620095727dd2a823a94a3a8d47108361ad83Manman Ren  bool EmitDone;
291f098620095727dd2a823a94a3a8d47108361ad83Manman Ren  /// Whether the machine function is modified during the pass.
292f098620095727dd2a823a94a3a8d47108361ad83Manman Ren  bool ModifiedMF;
293f098620095727dd2a823a94a3a8d47108361ad83Manman Ren
2940613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// userValues - All allocated UserValue instances.
295dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SmallVector<std::unique_ptr<UserValue>, 8> userValues;
2960613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2970613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// Map virtual register to eq class leader.
2980613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  typedef DenseMap<unsigned, UserValue*> VRMap;
2996ed4c6af97db8b2bbfd6b54dd2a58f16cf0c592bJakob Stoklund Olesen  VRMap virtRegToEqClass;
3000613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
3010613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// Map user variable to eq class leader.
3020613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  typedef DenseMap<const MDNode *, UserValue*> UVMap;
3030613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  UVMap userVarMap;
3040613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
3050613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// getUserValue - Find or create a UserValue.
30637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  UserValue *getUserValue(const MDNode *Var, const MDNode *Expr,
30737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                          unsigned Offset, bool IsIndirect, DebugLoc DL);
3080613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
30930e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen  /// lookupVirtReg - Find the EC leader for VirtReg or null.
31030e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen  UserValue *lookupVirtReg(unsigned VirtReg);
31130e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen
3120613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// handleDebugValue - Add DBG_VALUE instruction to our maps.
3130613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @param MI  DBG_VALUE instruction
3140613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @param Idx Last valid SLotIndex before instruction.
3150613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @return    True if the DBG_VALUE instruction should be deleted.
3160613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  bool handleDebugValue(MachineInstr *MI, SlotIndex Idx);
3170613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
3180613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// collectDebugValues - Collect and erase all DBG_VALUE instructions, adding
3190613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// a UserValue def for each instruction.
3200613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @param mf MachineFunction to be scanned.
3210613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @return True if any debug values were found.
3220613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  bool collectDebugValues(MachineFunction &mf);
3230613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
3240613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// computeIntervals - Compute the live intervals of all user values after
3250613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// collecting all their def points.
3260613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  void computeIntervals();
3270613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
3280613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenpublic:
329c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  LDVImpl(LiveDebugVariables *ps)
330c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      : pass(*ps), MF(nullptr), EmitDone(false), ModifiedMF(false) {}
3310613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  bool runOnMachineFunction(MachineFunction &mf);
3320613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
333f098620095727dd2a823a94a3a8d47108361ad83Manman Ren  /// clear - Release all memory.
3340613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  void clear() {
335c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    MF = nullptr;
3360613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    userValues.clear();
3376ed4c6af97db8b2bbfd6b54dd2a58f16cf0c592bJakob Stoklund Olesen    virtRegToEqClass.clear();
3380613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    userVarMap.clear();
339f098620095727dd2a823a94a3a8d47108361ad83Manman Ren    // Make sure we call emitDebugValues if the machine function was modified.
340f098620095727dd2a823a94a3a8d47108361ad83Manman Ren    assert((!ModifiedMF || EmitDone) &&
341f098620095727dd2a823a94a3a8d47108361ad83Manman Ren           "Dbg values are not emitted in LDV");
342f098620095727dd2a823a94a3a8d47108361ad83Manman Ren    EmitDone = false;
343f098620095727dd2a823a94a3a8d47108361ad83Manman Ren    ModifiedMF = false;
34437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    LS.reset();
3450613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
3460613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
3471744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  /// mapVirtReg - Map virtual register to an equivalence class.
3481744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  void mapVirtReg(unsigned VirtReg, UserValue *EC);
3491744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen
350f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  /// splitRegister -  Replace all references to OldReg with NewRegs.
3511feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey  void splitRegister(unsigned OldReg, ArrayRef<unsigned> NewRegs);
352f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
353b3cecdfcf9a0b736d3c0f6f5abffb41ecda3577cEric Christopher  /// emitDebugValues - Recreate DBG_VALUE instruction from data structures.
35442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  void emitDebugValues(VirtRegMap *VRM);
35542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
3560613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  void print(raw_ostream&);
3570613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen};
3580613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen} // namespace
3590613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
3602c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainarstatic void printDebugLoc(DebugLoc DL, raw_ostream &CommentOS,
3612c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar                          const LLVMContext &Ctx) {
3622c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (!DL)
3632c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    return;
3642c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
3652c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  auto *Scope = cast<MDScope>(DL.getScope());
3662c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  // Omit the directory, because it's likely to be long and uninteresting.
3672c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  CommentOS << Scope->getFilename();
3682c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  CommentOS << ':' << DL.getLine();
3692c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (DL.getCol() != 0)
3702c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    CommentOS << ':' << DL.getCol();
3712c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
3722c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  DebugLoc InlinedAtDL = DL.getInlinedAt();
3732c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (!InlinedAtDL)
3742c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    return;
3752c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
3762c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  CommentOS << " @[ ";
3772c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  printDebugLoc(InlinedAtDL, CommentOS, Ctx);
3782c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  CommentOS << " ]";
3792c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar}
3802c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
3812c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainarstatic void printExtendedName(raw_ostream &OS, const MDLocalVariable *V,
3822c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar                              const MDLocation *DL) {
3832c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  const LLVMContext &Ctx = V->getContext();
3842c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  StringRef Res = V->getName();
3852c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (!Res.empty())
3862c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    OS << Res << "," << V->getLine();
3872c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  if (auto *InlinedAt = DL->getInlinedAt()) {
3882c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    if (DebugLoc InlinedAtDL = InlinedAt) {
3892c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      OS << " @[";
3902c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      printDebugLoc(InlinedAtDL, OS, Ctx);
3912c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      OS << "]";
3922c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    }
3932c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  }
3942c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar}
3952c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
3964c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarvoid UserValue::print(raw_ostream &OS, const TargetRegisterInfo *TRI) {
3972c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  DIVariable DV = cast<MDLocalVariable>(Variable);
39837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  OS << "!\"";
3992c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  printExtendedName(OS, DV, dl);
4002c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
401a2b552d0aec83b1d030b878a130c8fefafe4d3c3Devang Patel  OS << "\"\t";
4020613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  if (offset)
4030613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    OS << '+' << offset;
4040613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  for (LocMap::const_iterator I = locInts.begin(); I.valid(); ++I) {
4050613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    OS << " [" << I.start() << ';' << I.stop() << "):";
4060613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (I.value() == ~0u)
4070613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      OS << "undef";
4080613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    else
4090613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      OS << I.value();
4100613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
411e77150bbcbf1f53b3830904be4d243c618c00b14Jakob Stoklund Olesen  for (unsigned i = 0, e = locations.size(); i != e; ++i) {
412e77150bbcbf1f53b3830904be4d243c618c00b14Jakob Stoklund Olesen    OS << " Loc" << i << '=';
4134c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    locations[i].print(OS, TRI);
414e77150bbcbf1f53b3830904be4d243c618c00b14Jakob Stoklund Olesen  }
4150613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  OS << '\n';
4160613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
4170613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4180613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid LDVImpl::print(raw_ostream &OS) {
4190613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  OS << "********** DEBUG VARIABLES **********\n";
4200613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  for (unsigned i = 0, e = userValues.size(); i != e; ++i)
4214c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    userValues[i]->print(OS, TRI);
4220613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
4230613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4245daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesenvoid UserValue::coalesceLocation(unsigned LocNo) {
4250804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  unsigned KeepLoc = 0;
4260804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  for (unsigned e = locations.size(); KeepLoc != e; ++KeepLoc) {
4270804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    if (KeepLoc == LocNo)
4280804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen      continue;
4290804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    if (locations[KeepLoc].isIdenticalTo(locations[LocNo]))
4300804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen      break;
4315daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  }
4320804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  // No matches.
4330804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  if (KeepLoc == locations.size())
4340804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    return;
4350804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen
4360804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  // Keep the smaller location, erase the larger one.
4370804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  unsigned EraseLoc = LocNo;
4380804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  if (KeepLoc > EraseLoc)
4390804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    std::swap(KeepLoc, EraseLoc);
4405daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  locations.erase(locations.begin() + EraseLoc);
4415daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen
4425daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  // Rewrite values.
4435daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  for (LocMap::iterator I = locInts.begin(); I.valid(); ++I) {
4445daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen    unsigned v = I.value();
4455daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen    if (v == EraseLoc)
4465daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen      I.setValue(KeepLoc);      // Coalesce when possible.
4475daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen    else if (v > EraseLoc)
4485daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen      I.setValueUnchecked(v-1); // Avoid coalescing with untransformed values.
4495daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  }
4505daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen}
4515daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen
4521744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesenvoid UserValue::mapVirtRegs(LDVImpl *LDV) {
4531744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  for (unsigned i = 0, e = locations.size(); i != e; ++i)
4541744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    if (locations[i].isReg() &&
4551744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen        TargetRegisterInfo::isVirtualRegister(locations[i].getReg()))
4561744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      LDV->mapVirtReg(locations[i].getReg(), this);
4571744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen}
4581744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen
45937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesUserValue *LDVImpl::getUserValue(const MDNode *Var, const MDNode *Expr,
46037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                 unsigned Offset, bool IsIndirect,
46137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                 DebugLoc DL) {
4620613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  UserValue *&Leader = userVarMap[Var];
4630613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  if (Leader) {
4640613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    UserValue *UV = Leader->getLeader();
4650613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    Leader = UV;
4660613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    for (; UV; UV = UV->getNext())
4672c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      if (UV->match(Var, Expr, DL->getInlinedAt(), Offset, IsIndirect))
4680613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        return UV;
4690613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
4700613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
471dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  userValues.push_back(
47237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      make_unique<UserValue>(Var, Expr, Offset, IsIndirect, DL, allocator));
473dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  UserValue *UV = userValues.back().get();
4740613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  Leader = UserValue::merge(Leader, UV);
4750613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  return UV;
4760613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
4770613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4780613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid LDVImpl::mapVirtReg(unsigned VirtReg, UserValue *EC) {
4790613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  assert(TargetRegisterInfo::isVirtualRegister(VirtReg) && "Only map VirtRegs");
4806ed4c6af97db8b2bbfd6b54dd2a58f16cf0c592bJakob Stoklund Olesen  UserValue *&Leader = virtRegToEqClass[VirtReg];
4810613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  Leader = UserValue::merge(Leader, EC);
4820613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
4830613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
48430e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund OlesenUserValue *LDVImpl::lookupVirtReg(unsigned VirtReg) {
4856ed4c6af97db8b2bbfd6b54dd2a58f16cf0c592bJakob Stoklund Olesen  if (UserValue *UV = virtRegToEqClass.lookup(VirtReg))
48630e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen    return UV->getLeader();
487dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return nullptr;
48830e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen}
48930e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen
4900613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenbool LDVImpl::handleDebugValue(MachineInstr *MI, SlotIndex Idx) {
4910613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  // DBG_VALUE loc, offset, variable
49237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (MI->getNumOperands() != 4 ||
4933517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl      !(MI->getOperand(1).isReg() || MI->getOperand(1).isImm()) ||
4943517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl      !MI->getOperand(2).isMetadata()) {
4950613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    DEBUG(dbgs() << "Can't handle " << *MI);
4960613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    return false;
4970613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
4980613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4990613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  // Get or create the UserValue for (variable,offset).
500818833f27929d650b4323774cd3660860588f687Adrian Prantl  bool IsIndirect = MI->isIndirectDebugValue();
5013517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl  unsigned Offset = IsIndirect ? MI->getOperand(1).getImm() : 0;
50237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  const MDNode *Var = MI->getDebugVariable();
50337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  const MDNode *Expr = MI->getDebugExpression();
504818833f27929d650b4323774cd3660860588f687Adrian Prantl  //here.
50537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  UserValue *UV =
50637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      getUserValue(Var, Expr, Offset, IsIndirect, MI->getDebugLoc());
5070613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  UV->addDef(Idx, MI->getOperand(0));
5080613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  return true;
5090613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
5100613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
5110613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenbool LDVImpl::collectDebugValues(MachineFunction &mf) {
5120613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  bool Changed = false;
5130613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  for (MachineFunction::iterator MFI = mf.begin(), MFE = mf.end(); MFI != MFE;
5140613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen       ++MFI) {
5150613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    MachineBasicBlock *MBB = MFI;
5160613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    for (MachineBasicBlock::iterator MBBI = MBB->begin(), MBBE = MBB->end();
5170613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen         MBBI != MBBE;) {
5180613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      if (!MBBI->isDebugValue()) {
5190613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        ++MBBI;
5200613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        continue;
5210613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      }
5220613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      // DBG_VALUE has no slot index, use the previous instruction instead.
5230613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      SlotIndex Idx = MBBI == MBB->begin() ?
5240613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        LIS->getMBBStartIdx(MBB) :
52536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        LIS->getInstructionIndex(std::prev(MBBI)).getRegSlot();
5260613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      // Handle consecutive DBG_VALUE instructions with the same slot index.
5270613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      do {
5280613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        if (handleDebugValue(MBBI, Idx)) {
5290613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen          MBBI = MBB->erase(MBBI);
5300613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen          Changed = true;
5310613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        } else
5320613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen          ++MBBI;
5330613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      } while (MBBI != MBBE && MBBI->isDebugValue());
5340613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    }
5350613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
5360613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  return Changed;
5370613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
5380613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
5390613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid UserValue::extendDef(SlotIndex Idx, unsigned LocNo,
5404f3b5e8c9232e43d1291aab8db5f5698d7ee0ea4Matthias Braun                          LiveRange *LR, const VNInfo *VNI,
5411744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen                          SmallVectorImpl<SlotIndex> *Kills,
542c722c3d5ffd4ad07e17f81c2b2eb7f8074559600Devang Patel                          LiveIntervals &LIS, MachineDominatorTree &MDT,
543b82062f65265666690270f3358b0d0f508d3fbbaEric Christopher                          UserValueScopes &UVS) {
5440613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  SmallVector<SlotIndex, 16> Todo;
5450613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  Todo.push_back(Idx);
5460613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  do {
5470613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    SlotIndex Start = Todo.pop_back_val();
5480613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    MachineBasicBlock *MBB = LIS.getMBBFromIndex(Start);
5490613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    SlotIndex Stop = LIS.getMBBEndIdx(MBB);
55012a40314a91511b65bc83782fd5a3e981331adb1Jakob Stoklund Olesen    LocMap::iterator I = locInts.find(Start);
5510613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
5520613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    // Limit to VNI's live range.
5530613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    bool ToEnd = true;
5544f3b5e8c9232e43d1291aab8db5f5698d7ee0ea4Matthias Braun    if (LR && VNI) {
5554f3b5e8c9232e43d1291aab8db5f5698d7ee0ea4Matthias Braun      LiveInterval::Segment *Segment = LR->getSegmentContaining(Start);
556331de11a0acc6a095b98914b5f05ff242c9d7819Matthias Braun      if (!Segment || Segment->valno != VNI) {
5571744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen        if (Kills)
5581744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen          Kills->push_back(Start);
5590613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        continue;
5601744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      }
561331de11a0acc6a095b98914b5f05ff242c9d7819Matthias Braun      if (Segment->end < Stop)
562331de11a0acc6a095b98914b5f05ff242c9d7819Matthias Braun        Stop = Segment->end, ToEnd = false;
5630613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    }
5640613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
5650613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    // There could already be a short def at Start.
5660613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (I.valid() && I.start() <= Start) {
5670613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      // Stop when meeting a different location or an already extended interval.
5680613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      Start = Start.getNextSlot();
5690613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      if (I.value() != LocNo || I.stop() != Start)
5700613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        continue;
5710613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      // This is a one-slot placeholder. Just skip it.
5720613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      ++I;
5730613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    }
5740613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
5750613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    // Limited by the next def.
5760613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (I.valid() && I.start() < Stop)
5770613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      Stop = I.start(), ToEnd = false;
5781744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    // Limited by VNI's live range.
5791744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    else if (!ToEnd && Kills)
5801744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      Kills->push_back(Stop);
5810613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
5820613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (Start >= Stop)
5830613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      continue;
5840613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
5850613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    I.insert(Start, Stop, LocNo);
5860613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
5870613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    // If we extended to the MBB end, propagate down the dominator tree.
5880613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (!ToEnd)
5890613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      continue;
5900613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    const std::vector<MachineDomTreeNode*> &Children =
5910613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      MDT.getNode(MBB)->getChildren();
592c722c3d5ffd4ad07e17f81c2b2eb7f8074559600Devang Patel    for (unsigned i = 0, e = Children.size(); i != e; ++i) {
593c722c3d5ffd4ad07e17f81c2b2eb7f8074559600Devang Patel      MachineBasicBlock *MBB = Children[i]->getBlock();
5943a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patel      if (UVS.dominates(MBB))
595c722c3d5ffd4ad07e17f81c2b2eb7f8074559600Devang Patel        Todo.push_back(LIS.getMBBStartIdx(MBB));
596c722c3d5ffd4ad07e17f81c2b2eb7f8074559600Devang Patel    }
5970613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  } while (!Todo.empty());
5980613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
5990613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
6000613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid
6011744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund OlesenUserValue::addDefsFromCopies(LiveInterval *LI, unsigned LocNo,
6021744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen                      const SmallVectorImpl<SlotIndex> &Kills,
6031744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen                      SmallVectorImpl<std::pair<SlotIndex, unsigned> > &NewDefs,
6041744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen                      MachineRegisterInfo &MRI, LiveIntervals &LIS) {
6051744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  if (Kills.empty())
6061744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    return;
6071744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  // Don't track copies from physregs, there are too many uses.
6081744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  if (!TargetRegisterInfo::isVirtualRegister(LI->reg))
6091744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    return;
6101744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen
6111744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  // Collect all the (vreg, valno) pairs that are copies of LI.
6121744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  SmallVector<std::pair<LiveInterval*, const VNInfo*>, 8> CopyValues;
61336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  for (MachineOperand &MO : MRI.use_nodbg_operands(LI->reg)) {
61436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    MachineInstr *MI = MO.getParent();
6151744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    // Copies of the full value.
61636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (MO.getSubReg() || !MI->isCopy())
6171744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      continue;
6181744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    unsigned DstReg = MI->getOperand(0).getReg();
6191744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen
62028cf1156c93afabedc69fe7b73aa92ce85e323a5Jakob Stoklund Olesen    // Don't follow copies to physregs. These are usually setting up call
62128cf1156c93afabedc69fe7b73aa92ce85e323a5Jakob Stoklund Olesen    // arguments, and the argument registers are always call clobbered. We are
62228cf1156c93afabedc69fe7b73aa92ce85e323a5Jakob Stoklund Olesen    // better off in the source register which could be a callee-saved register,
62328cf1156c93afabedc69fe7b73aa92ce85e323a5Jakob Stoklund Olesen    // or it could be spilled.
62428cf1156c93afabedc69fe7b73aa92ce85e323a5Jakob Stoklund Olesen    if (!TargetRegisterInfo::isVirtualRegister(DstReg))
62528cf1156c93afabedc69fe7b73aa92ce85e323a5Jakob Stoklund Olesen      continue;
62628cf1156c93afabedc69fe7b73aa92ce85e323a5Jakob Stoklund Olesen
6271744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    // Is LocNo extended to reach this copy? If not, another def may be blocking
6281744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    // it, or we are looking at a wrong value of LI.
6291744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    SlotIndex Idx = LIS.getInstructionIndex(MI);
6302debd48ca790ac01be6e12e094fdf4fdcadc8364Jakob Stoklund Olesen    LocMap::iterator I = locInts.find(Idx.getRegSlot(true));
6311744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    if (!I.valid() || I.value() != LocNo)
6321744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      continue;
6331744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen
6341744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    if (!LIS.hasInterval(DstReg))
6351744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      continue;
6361744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    LiveInterval *DstLI = &LIS.getInterval(DstReg);
6372debd48ca790ac01be6e12e094fdf4fdcadc8364Jakob Stoklund Olesen    const VNInfo *DstVNI = DstLI->getVNInfoAt(Idx.getRegSlot());
6382debd48ca790ac01be6e12e094fdf4fdcadc8364Jakob Stoklund Olesen    assert(DstVNI && DstVNI->def == Idx.getRegSlot() && "Bad copy value");
6391744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    CopyValues.push_back(std::make_pair(DstLI, DstVNI));
6401744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  }
6411744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen
6421744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  if (CopyValues.empty())
6431744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    return;
6441744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen
6451744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  DEBUG(dbgs() << "Got " << CopyValues.size() << " copies of " << *LI << '\n');
6461744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen
6471744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  // Try to add defs of the copied values for each kill point.
6481744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  for (unsigned i = 0, e = Kills.size(); i != e; ++i) {
6491744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    SlotIndex Idx = Kills[i];
6501744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    for (unsigned j = 0, e = CopyValues.size(); j != e; ++j) {
6511744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      LiveInterval *DstLI = CopyValues[j].first;
6521744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      const VNInfo *DstVNI = CopyValues[j].second;
6531744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      if (DstLI->getVNInfoAt(Idx) != DstVNI)
6541744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen        continue;
6551744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      // Check that there isn't already a def at Idx
6561744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      LocMap::iterator I = locInts.find(Idx);
6571744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      if (I.valid() && I.start() <= Idx)
6581744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen        continue;
6591744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      DEBUG(dbgs() << "Kill at " << Idx << " covered by valno #"
6601744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen                   << DstVNI->id << " in " << *DstLI << '\n');
6611744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      MachineInstr *CopyMI = LIS.getInstructionFromIndex(DstVNI->def);
6621744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      assert(CopyMI && CopyMI->isCopy() && "Bad copy value");
6631744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      unsigned LocNo = getLocationNo(CopyMI->getOperand(0));
6641744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      I.insert(Idx, Idx.getNextSlot(), LocNo);
6651744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      NewDefs.push_back(std::make_pair(Idx, LocNo));
6661744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      break;
6671744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    }
6681744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  }
6691744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen}
6701744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen
6711744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesenvoid
6721744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund OlesenUserValue::computeIntervals(MachineRegisterInfo &MRI,
673e8a0a1286417e73f4b2bffe21ae45882701e703fJakob Stoklund Olesen                            const TargetRegisterInfo &TRI,
6741744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen                            LiveIntervals &LIS,
675c722c3d5ffd4ad07e17f81c2b2eb7f8074559600Devang Patel                            MachineDominatorTree &MDT,
676b82062f65265666690270f3358b0d0f508d3fbbaEric Christopher                            UserValueScopes &UVS) {
6770613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  SmallVector<std::pair<SlotIndex, unsigned>, 16> Defs;
6780613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
6790613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  // Collect all defs to be extended (Skipping undefs).
6800613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  for (LocMap::const_iterator I = locInts.begin(); I.valid(); ++I)
6810613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (I.value() != ~0u)
6820613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      Defs.push_back(std::make_pair(I.start(), I.value()));
6830613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
6841744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  // Extend all defs, and possibly add new ones along the way.
6851744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  for (unsigned i = 0; i != Defs.size(); ++i) {
6860613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    SlotIndex Idx = Defs[i].first;
6870613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    unsigned LocNo = Defs[i].second;
6880804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    const MachineOperand &Loc = locations[LocNo];
6890613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
690e8a0a1286417e73f4b2bffe21ae45882701e703fJakob Stoklund Olesen    if (!Loc.isReg()) {
691dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      extendDef(Idx, LocNo, nullptr, nullptr, nullptr, LIS, MDT, UVS);
692e8a0a1286417e73f4b2bffe21ae45882701e703fJakob Stoklund Olesen      continue;
693e8a0a1286417e73f4b2bffe21ae45882701e703fJakob Stoklund Olesen    }
694e8a0a1286417e73f4b2bffe21ae45882701e703fJakob Stoklund Olesen
6950613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    // Register locations are constrained to where the register value is live.
696e8a0a1286417e73f4b2bffe21ae45882701e703fJakob Stoklund Olesen    if (TargetRegisterInfo::isVirtualRegister(Loc.getReg())) {
697dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      LiveInterval *LI = nullptr;
698dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      const VNInfo *VNI = nullptr;
699b150930910a254377a62ed74af981c37eafe8fcbJakob Stoklund Olesen      if (LIS.hasInterval(Loc.getReg())) {
700b150930910a254377a62ed74af981c37eafe8fcbJakob Stoklund Olesen        LI = &LIS.getInterval(Loc.getReg());
701b150930910a254377a62ed74af981c37eafe8fcbJakob Stoklund Olesen        VNI = LI->getVNInfoAt(Idx);
702b150930910a254377a62ed74af981c37eafe8fcbJakob Stoklund Olesen      }
7031744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      SmallVector<SlotIndex, 16> Kills;
7043a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patel      extendDef(Idx, LocNo, LI, VNI, &Kills, LIS, MDT, UVS);
705b150930910a254377a62ed74af981c37eafe8fcbJakob Stoklund Olesen      if (LI)
706b150930910a254377a62ed74af981c37eafe8fcbJakob Stoklund Olesen        addDefsFromCopies(LI, LocNo, Kills, Defs, MRI, LIS);
707e8a0a1286417e73f4b2bffe21ae45882701e703fJakob Stoklund Olesen      continue;
708e8a0a1286417e73f4b2bffe21ae45882701e703fJakob Stoklund Olesen    }
709e8a0a1286417e73f4b2bffe21ae45882701e703fJakob Stoklund Olesen
710e8a0a1286417e73f4b2bffe21ae45882701e703fJakob Stoklund Olesen    // For physregs, use the live range of the first regunit as a guide.
711e8a0a1286417e73f4b2bffe21ae45882701e703fJakob Stoklund Olesen    unsigned Unit = *MCRegUnitIterator(Loc.getReg(), &TRI);
7124f3b5e8c9232e43d1291aab8db5f5698d7ee0ea4Matthias Braun    LiveRange *LR = &LIS.getRegUnit(Unit);
7134f3b5e8c9232e43d1291aab8db5f5698d7ee0ea4Matthias Braun    const VNInfo *VNI = LR->getVNInfoAt(Idx);
714e8a0a1286417e73f4b2bffe21ae45882701e703fJakob Stoklund Olesen    // Don't track copies from physregs, it is too expensive.
715dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    extendDef(Idx, LocNo, LR, VNI, nullptr, LIS, MDT, UVS);
7160613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
7170613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
7180613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  // Finally, erase all the undefs.
7190613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  for (LocMap::iterator I = locInts.begin(); I.valid();)
7200613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (I.value() == ~0u)
7210613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      I.erase();
7220613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    else
7230613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      ++I;
7240613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
7250613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
7260613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid LDVImpl::computeIntervals() {
7271744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  for (unsigned i = 0, e = userValues.size(); i != e; ++i) {
7283a2d80df88c28dc8b2d3a855c3ebd7935c8ad125Devang Patel    UserValueScopes UVS(userValues[i]->getDebugLoc(), LS);
729e8a0a1286417e73f4b2bffe21ae45882701e703fJakob Stoklund Olesen    userValues[i]->computeIntervals(MF->getRegInfo(), *TRI, *LIS, *MDT, UVS);
7301744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    userValues[i]->mapVirtRegs(this);
7311744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  }
7320613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
7330613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
7340613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenbool LDVImpl::runOnMachineFunction(MachineFunction &mf) {
735c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  clear();
7360613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  MF = &mf;
7370613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  LIS = &pass.getAnalysis<LiveIntervals>();
7380613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  MDT = &pass.getAnalysis<MachineDominatorTree>();
73937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  TRI = mf.getSubtarget().getRegisterInfo();
740c722c3d5ffd4ad07e17f81c2b2eb7f8074559600Devang Patel  LS.initialize(mf);
7410613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  DEBUG(dbgs() << "********** COMPUTING LIVE DEBUG VARIABLES: "
742986d76d7b3844b9a2f3d01a48975952749267a93David Blaikie               << mf.getName() << " **********\n");
7430613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
7440613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  bool Changed = collectDebugValues(mf);
7450613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  computeIntervals();
7460613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  DEBUG(print(dbgs()));
747f098620095727dd2a823a94a3a8d47108361ad83Manman Ren  ModifiedMF = Changed;
7480613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  return Changed;
7490613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
7500613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
75137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstatic void removeDebugValues(MachineFunction &mf) {
75237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  for (MachineBasicBlock &MBB : mf) {
75337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    for (auto MBBI = MBB.begin(), MBBE = MBB.end(); MBBI != MBBE; ) {
75437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      if (!MBBI->isDebugValue()) {
75537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        ++MBBI;
75637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        continue;
75737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      }
75837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      MBBI = MBB.erase(MBBI);
75937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    }
76037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
76137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
76237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
763bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesenbool LiveDebugVariables::runOnMachineFunction(MachineFunction &mf) {
76451a666f0e50a34b74212db9c5814153c885153a5Devang Patel  if (!EnableLDV)
76551a666f0e50a34b74212db9c5814153c885153a5Devang Patel    return false;
76637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (!FunctionDIs.count(mf.getFunction())) {
76737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    removeDebugValues(mf);
768c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    return false;
76937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
7700613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  if (!pImpl)
7710613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    pImpl = new LDVImpl(this);
772f098620095727dd2a823a94a3a8d47108361ad83Manman Ren  return static_cast<LDVImpl*>(pImpl)->runOnMachineFunction(mf);
7730613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
7740613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
7750613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid LiveDebugVariables::releaseMemory() {
776f098620095727dd2a823a94a3a8d47108361ad83Manman Ren  if (pImpl)
7770613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    static_cast<LDVImpl*>(pImpl)->clear();
7780613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
7790613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
7800613516b16466a92c68d60734801221506c85e86Jakob Stoklund OlesenLiveDebugVariables::~LiveDebugVariables() {
7810613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  if (pImpl)
7820613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    delete static_cast<LDVImpl*>(pImpl);
783bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen}
78430e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen
785f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen//===----------------------------------------------------------------------===//
786f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen//                           Live Range Splitting
787f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen//===----------------------------------------------------------------------===//
788f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
789f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesenbool
7901feb5854aeeda897e9318c8193d187673c8576b8Mark LaceyUserValue::splitLocation(unsigned OldLocNo, ArrayRef<unsigned> NewRegs,
7911feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey                         LiveIntervals& LIS) {
792f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  DEBUG({
793f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    dbgs() << "Splitting Loc" << OldLocNo << '\t';
794dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    print(dbgs(), nullptr);
795f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  });
796f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  bool DidChange = false;
797f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  LocMap::iterator LocMapI;
798f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  LocMapI.setMap(locInts);
799f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  for (unsigned i = 0; i != NewRegs.size(); ++i) {
8001feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey    LiveInterval *LI = &LIS.getInterval(NewRegs[i]);
801f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    if (LI->empty())
802f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      continue;
803f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
804f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    // Don't allocate the new LocNo until it is needed.
805f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    unsigned NewLocNo = ~0u;
806f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
807f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    // Iterate over the overlaps between locInts and LI.
808f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    LocMapI.find(LI->beginIndex());
809f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    if (!LocMapI.valid())
810f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      continue;
811f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    LiveInterval::iterator LII = LI->advanceTo(LI->begin(), LocMapI.start());
812f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    LiveInterval::iterator LIE = LI->end();
813f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    while (LocMapI.valid() && LII != LIE) {
814f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      // At this point, we know that LocMapI.stop() > LII->start.
815f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      LII = LI->advanceTo(LII, LocMapI.start());
816f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      if (LII == LIE)
817f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        break;
818f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
819f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      // Now LII->end > LocMapI.start(). Do we have an overlap?
820f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      if (LocMapI.value() == OldLocNo && LII->start < LocMapI.stop()) {
821f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        // Overlapping correct location. Allocate NewLocNo now.
822f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        if (NewLocNo == ~0u) {
823f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          MachineOperand MO = MachineOperand::CreateReg(LI->reg, false);
824f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          MO.setSubReg(locations[OldLocNo].getSubReg());
825f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          NewLocNo = getLocationNo(MO);
826f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          DidChange = true;
827f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        }
828f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
829f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        SlotIndex LStart = LocMapI.start();
830f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        SlotIndex LStop  = LocMapI.stop();
831f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
832f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        // Trim LocMapI down to the LII overlap.
833f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        if (LStart < LII->start)
834f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          LocMapI.setStartUnchecked(LII->start);
835f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        if (LStop > LII->end)
836f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          LocMapI.setStopUnchecked(LII->end);
837f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
838f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        // Change the value in the overlap. This may trigger coalescing.
839f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        LocMapI.setValue(NewLocNo);
840f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
841f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        // Re-insert any removed OldLocNo ranges.
842f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        if (LStart < LocMapI.start()) {
843f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          LocMapI.insert(LStart, LocMapI.start(), OldLocNo);
844f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          ++LocMapI;
845f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          assert(LocMapI.valid() && "Unexpected coalescing");
846f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        }
847f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        if (LStop > LocMapI.stop()) {
848f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          ++LocMapI;
849f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          LocMapI.insert(LII->end, LStop, OldLocNo);
850f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          --LocMapI;
851f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        }
852f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      }
853f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
854f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      // Advance to the next overlap.
855f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      if (LII->end < LocMapI.stop()) {
856f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        if (++LII == LIE)
857f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          break;
858f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        LocMapI.advanceTo(LII->start);
859f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      } else {
860f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        ++LocMapI;
861f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        if (!LocMapI.valid())
862f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          break;
863f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        LII = LI->advanceTo(LII, LocMapI.start());
864f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      }
865f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    }
866f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  }
867f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
868f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  // Finally, remove any remaining OldLocNo intervals and OldLocNo itself.
869f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  locations.erase(locations.begin() + OldLocNo);
870f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  LocMapI.goToBegin();
871f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  while (LocMapI.valid()) {
872f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    unsigned v = LocMapI.value();
873f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    if (v == OldLocNo) {
874f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      DEBUG(dbgs() << "Erasing [" << LocMapI.start() << ';'
875f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen                   << LocMapI.stop() << ")\n");
876f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      LocMapI.erase();
877f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    } else {
878f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      if (v > OldLocNo)
879f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        LocMapI.setValueUnchecked(v-1);
880f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      ++LocMapI;
881f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    }
882f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  }
883f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
884dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  DEBUG({dbgs() << "Split result: \t"; print(dbgs(), nullptr);});
885f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  return DidChange;
886f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen}
887f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
888f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesenbool
8891feb5854aeeda897e9318c8193d187673c8576b8Mark LaceyUserValue::splitRegister(unsigned OldReg, ArrayRef<unsigned> NewRegs,
8901feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey                         LiveIntervals &LIS) {
891f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  bool DidChange = false;
8926212f9a304d7f8061c87920d39bddbc19afecb0cJakob Stoklund Olesen  // Split locations referring to OldReg. Iterate backwards so splitLocation can
8937cc5177d460333ca9a2f3c0783dd0d0490456867Eric Christopher  // safely erase unused locations.
8946212f9a304d7f8061c87920d39bddbc19afecb0cJakob Stoklund Olesen  for (unsigned i = locations.size(); i ; --i) {
8956212f9a304d7f8061c87920d39bddbc19afecb0cJakob Stoklund Olesen    unsigned LocNo = i-1;
896f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    const MachineOperand *Loc = &locations[LocNo];
897f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    if (!Loc->isReg() || Loc->getReg() != OldReg)
898f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      continue;
8991feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey    DidChange |= splitLocation(LocNo, NewRegs, LIS);
900f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  }
901f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  return DidChange;
902f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen}
903f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
9041feb5854aeeda897e9318c8193d187673c8576b8Mark Laceyvoid LDVImpl::splitRegister(unsigned OldReg, ArrayRef<unsigned> NewRegs) {
905f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  bool DidChange = false;
906f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  for (UserValue *UV = lookupVirtReg(OldReg); UV; UV = UV->getNext())
9071feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey    DidChange |= UV->splitRegister(OldReg, NewRegs, *LIS);
908f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
909f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  if (!DidChange)
910f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    return;
911f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
912f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  // Map all of the new virtual registers.
913f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  UserValue *UV = lookupVirtReg(OldReg);
914f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  for (unsigned i = 0; i != NewRegs.size(); ++i)
9151feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey    mapVirtReg(NewRegs[i], UV);
916f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen}
917f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
918f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesenvoid LiveDebugVariables::
9191feb5854aeeda897e9318c8193d187673c8576b8Mark LaceysplitRegister(unsigned OldReg, ArrayRef<unsigned> NewRegs, LiveIntervals &LIS) {
920f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  if (pImpl)
921f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    static_cast<LDVImpl*>(pImpl)->splitRegister(OldReg, NewRegs);
922f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen}
923f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
92442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenvoid
92542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund OlesenUserValue::rewriteLocations(VirtRegMap &VRM, const TargetRegisterInfo &TRI) {
92642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  // Iterate over locations in reverse makes it easier to handle coalescing.
92742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  for (unsigned i = locations.size(); i ; --i) {
92842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    unsigned LocNo = i-1;
9290804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    MachineOperand &Loc = locations[LocNo];
93042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    // Only virtual registers are rewritten.
9310804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    if (!Loc.isReg() || !Loc.getReg() ||
9320804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen        !TargetRegisterInfo::isVirtualRegister(Loc.getReg()))
93342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      continue;
9340804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    unsigned VirtReg = Loc.getReg();
935f203627f21614cbef9526aa791b3e7b0493d1e41Jakob Stoklund Olesen    if (VRM.isAssignedReg(VirtReg) &&
936f203627f21614cbef9526aa791b3e7b0493d1e41Jakob Stoklund Olesen        TargetRegisterInfo::isPhysicalRegister(VRM.getPhys(VirtReg))) {
937cf724f078623e786fc92335fdb0ec70b46f2e86dJakob Stoklund Olesen      // This can create a %noreg operand in rare cases when the sub-register
938cf724f078623e786fc92335fdb0ec70b46f2e86dJakob Stoklund Olesen      // index is no longer available. That means the user value is in a
939cf724f078623e786fc92335fdb0ec70b46f2e86dJakob Stoklund Olesen      // non-existent sub-register, and %noreg is exactly what we want.
9400804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen      Loc.substPhysReg(VRM.getPhys(VirtReg), TRI);
941cb39064e7aee2273da1d00e6b800db84ddc34b6bJakob Stoklund Olesen    } else if (VRM.getStackSlot(VirtReg) != VirtRegMap::NO_STACK_SLOT) {
94242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      // FIXME: Translate SubIdx to a stackslot offset.
9430804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen      Loc = MachineOperand::CreateFI(VRM.getStackSlot(VirtReg));
94442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    } else {
9450804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen      Loc.setReg(0);
9460804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen      Loc.setSubReg(0);
94742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    }
9485daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen    coalesceLocation(LocNo);
94942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  }
95042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen}
95142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
952f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel/// findInsertLocation - Find an iterator for inserting a DBG_VALUE
95342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen/// instruction.
95442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenstatic MachineBasicBlock::iterator
955f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang PatelfindInsertLocation(MachineBasicBlock *MBB, SlotIndex Idx,
95642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen                   LiveIntervals &LIS) {
95742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  SlotIndex Start = LIS.getMBBStartIdx(MBB);
95842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  Idx = Idx.getBaseIndex();
95942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
96042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  // Try to find an insert location by going backwards from Idx.
96142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  MachineInstr *MI;
96242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  while (!(MI = LIS.getInstructionFromIndex(Idx))) {
96342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    // We've reached the beginning of MBB.
96442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    if (Idx == Start) {
96542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      MachineBasicBlock::iterator I = MBB->SkipPHIsAndLabels(MBB->begin());
96642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      return I;
96742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    }
96842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    Idx = Idx.getPrevIndex();
96942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  }
970f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel
971eea666f216ad3a8f8cd88a969176f86add7228f3Jakob Stoklund Olesen  // Don't insert anything after the first terminator, though.
9725a96b3dad2f634c9081c8b2b6c2575441dc5a2bdEvan Cheng  return MI->isTerminator() ? MBB->getFirstTerminator() :
97336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                              std::next(MachineBasicBlock::iterator(MI));
97442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen}
97542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
97642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenvoid UserValue::insertDebugValue(MachineBasicBlock *MBB, SlotIndex Idx,
97742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen                                 unsigned LocNo,
97842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen                                 LiveIntervals &LIS,
97942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen                                 const TargetInstrInfo &TII) {
980f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel  MachineBasicBlock::iterator I = findInsertLocation(MBB, Idx, LIS);
9810804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  MachineOperand &Loc = locations[LocNo];
982d9f3fc7faaa7686af3e1a004d86397da9c8e0449Devang Patel  ++NumInsertedDebugValues;
98342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
9842c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  assert(cast<MDLocalVariable>(Variable)
9852c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar             ->isValidLocationForIntrinsic(getDebugLoc()) &&
9862c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar         "Expected inlined-at fields to agree");
9873517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl  if (Loc.isReg())
9882c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    BuildMI(*MBB, I, getDebugLoc(), TII.get(TargetOpcode::DBG_VALUE),
98937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines            IsIndirect, Loc.getReg(), offset, Variable, Expression);
9903517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl  else
9912c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    BuildMI(*MBB, I, getDebugLoc(), TII.get(TargetOpcode::DBG_VALUE))
99237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        .addOperand(Loc)
99337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        .addImm(offset)
99437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        .addMetadata(Variable)
99537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        .addMetadata(Expression);
99642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen}
99742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
99842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenvoid UserValue::emitDebugValues(VirtRegMap *VRM, LiveIntervals &LIS,
99942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen                                const TargetInstrInfo &TII) {
100042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  MachineFunction::iterator MFEnd = VRM->getMachineFunction().end();
100142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
100242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  for (LocMap::const_iterator I = locInts.begin(); I.valid();) {
100342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    SlotIndex Start = I.start();
100442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    SlotIndex Stop = I.stop();
100542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    unsigned LocNo = I.value();
100642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    DEBUG(dbgs() << "\t[" << Start << ';' << Stop << "):" << LocNo);
100742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    MachineFunction::iterator MBB = LIS.getMBBFromIndex(Start);
100842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    SlotIndex MBBEnd = LIS.getMBBEndIdx(MBB);
100942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
101042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    DEBUG(dbgs() << " BB#" << MBB->getNumber() << '-' << MBBEnd);
101142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    insertDebugValue(MBB, Start, LocNo, LIS, TII);
101242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    // This interval may span multiple basic blocks.
101342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    // Insert a DBG_VALUE into each one.
101442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    while(Stop > MBBEnd) {
101542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      // Move to the next block.
101642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      Start = MBBEnd;
101742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      if (++MBB == MFEnd)
101842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen        break;
101942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      MBBEnd = LIS.getMBBEndIdx(MBB);
102042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      DEBUG(dbgs() << " BB#" << MBB->getNumber() << '-' << MBBEnd);
102142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      insertDebugValue(MBB, Start, LocNo, LIS, TII);
102242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    }
102342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    DEBUG(dbgs() << '\n');
102442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    if (MBB == MFEnd)
102542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      break;
102642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
102742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    ++I;
102842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  }
102942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen}
103042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
103142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenvoid LDVImpl::emitDebugValues(VirtRegMap *VRM) {
103242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  DEBUG(dbgs() << "********** EMITTING LIVE DEBUG VARIABLES **********\n");
1033c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  if (!MF)
1034c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    return;
103537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  const TargetInstrInfo *TII = MF->getSubtarget().getInstrInfo();
103642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  for (unsigned i = 0, e = userValues.size(); i != e; ++i) {
10374c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    DEBUG(userValues[i]->print(dbgs(), TRI));
103842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    userValues[i]->rewriteLocations(*VRM, *TRI);
103942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    userValues[i]->emitDebugValues(VRM, *LIS, *TII);
104042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  }
1041f098620095727dd2a823a94a3a8d47108361ad83Manman Ren  EmitDone = true;
104242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen}
104342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
104442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenvoid LiveDebugVariables::emitDebugValues(VirtRegMap *VRM) {
1045f098620095727dd2a823a94a3a8d47108361ad83Manman Ren  if (pImpl)
104642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    static_cast<LDVImpl*>(pImpl)->emitDebugValues(VRM);
104742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen}
104842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
1049c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesbool LiveDebugVariables::doInitialization(Module &M) {
1050c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  FunctionDIs = makeSubprogramMap(M);
1051c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  return Pass::doInitialization(M);
1052c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines}
105342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
105430e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen#ifndef NDEBUG
105530e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesenvoid LiveDebugVariables::dump() {
105630e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen  if (pImpl)
105730e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen    static_cast<LDVImpl*>(pImpl)->print(dbgs());
105830e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen}
105930e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen#endif
1060