LiveDebugVariables.cpp revision 25dc2268a5aedcb5da57f065dbdb40d790b11bc0
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
220613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#define DEBUG_TYPE "livedebug"
23bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen#include "LiveDebugVariables.h"
2442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen#include "VirtRegMap.h"
250613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#include "llvm/Constants.h"
260613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#include "llvm/Metadata.h"
270613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#include "llvm/Value.h"
280613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#include "llvm/ADT/IntervalMap.h"
29bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen#include "llvm/CodeGen/LiveIntervalAnalysis.h"
300613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#include "llvm/CodeGen/MachineDominators.h"
3142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen#include "llvm/CodeGen/MachineFunction.h"
3242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen#include "llvm/CodeGen/MachineInstrBuilder.h"
33bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen#include "llvm/CodeGen/Passes.h"
340613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#include "llvm/Support/CommandLine.h"
350613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#include "llvm/Support/Debug.h"
3642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen#include "llvm/Target/TargetInstrInfo.h"
37bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen#include "llvm/Target/TargetMachine.h"
380613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#include "llvm/Target/TargetRegisterInfo.h"
39bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen
40bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesenusing namespace llvm;
41bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen
4251a666f0e50a34b74212db9c5814153c885153a5Devang Patelstatic cl::opt<bool>
4325dc2268a5aedcb5da57f065dbdb40d790b11bc0Jakob Stoklund OlesenEnableLDV("live-debug-variables", cl::init(true),
4451a666f0e50a34b74212db9c5814153c885153a5Devang Patel          cl::desc("Enable the live debug variables pass"), cl::Hidden);
4551a666f0e50a34b74212db9c5814153c885153a5Devang Patel
46bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesenchar LiveDebugVariables::ID = 0;
47bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen
48bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund OlesenINITIALIZE_PASS_BEGIN(LiveDebugVariables, "livedebugvars",
49bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen                "Debug Variable Analysis", false, false)
500613516b16466a92c68d60734801221506c85e86Jakob Stoklund OlesenINITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
51bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund OlesenINITIALIZE_PASS_DEPENDENCY(LiveIntervals)
52bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund OlesenINITIALIZE_PASS_END(LiveDebugVariables, "livedebugvars",
53bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen                "Debug Variable Analysis", false, false)
54bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen
55bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesenvoid LiveDebugVariables::getAnalysisUsage(AnalysisUsage &AU) const {
560613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  AU.addRequired<MachineDominatorTree>();
57bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen  AU.addRequiredTransitive<LiveIntervals>();
58bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen  AU.setPreservesAll();
59bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen  MachineFunctionPass::getAnalysisUsage(AU);
60bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen}
61bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen
620613516b16466a92c68d60734801221506c85e86Jakob Stoklund OlesenLiveDebugVariables::LiveDebugVariables() : MachineFunctionPass(ID), pImpl(0) {
63bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen  initializeLiveDebugVariablesPass(*PassRegistry::getPassRegistry());
64bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen}
65bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen
660613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// LocMap - Map of where a user value is live, and its location.
670613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesentypedef IntervalMap<SlotIndex, unsigned, 4> LocMap;
680613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
690613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// UserValue - A user value is a part of a debug info user variable.
700613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen///
710613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// A DBG_VALUE instruction notes that (a sub-register of) a virtual register
720613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// holds part of a user variable. The part is identified by a byte offset.
730613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen///
740613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// UserValues are grouped into equivalence classes for easier searching. Two
750613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// user values are related if they refer to the same variable, or if they are
760613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// held by the same virtual register. The equivalence class is the transitive
770613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// closure of that relation.
780613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesennamespace {
790613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenclass UserValue {
800613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  const MDNode *variable; ///< The debug info variable we are part of.
810613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  unsigned offset;        ///< Byte offset into variable.
820613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
830613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  UserValue *leader;      ///< Equivalence class leader.
840613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  UserValue *next;        ///< Next value in equivalence class, or null.
850613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
860613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// Numbered locations referenced by locmap.
870804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  SmallVector<MachineOperand, 4> locations;
880613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
890613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// Map of slot indices where this value is live.
900613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  LocMap locInts;
910613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
925daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  /// coalesceLocation - After LocNo was changed, check if it has become
935daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  /// identical to another location, and coalesce them. This may cause LocNo or
945daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  /// a later location to be erased, but no earlier location will be erased.
955daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  void coalesceLocation(unsigned LocNo);
965daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen
9742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  /// insertDebugValue - Insert a DBG_VALUE into MBB at Idx for LocNo.
9842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  void insertDebugValue(MachineBasicBlock *MBB, SlotIndex Idx, unsigned LocNo,
9942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen                        LiveIntervals &LIS, const TargetInstrInfo &TII);
10042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
10142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  /// insertDebugKill - Insert an undef DBG_VALUE into MBB at Idx.
10242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  void insertDebugKill(MachineBasicBlock *MBB, SlotIndex Idx,
10342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen                       LiveIntervals &LIS, const TargetInstrInfo &TII);
10442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
1050613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenpublic:
1060613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// UserValue - Create a new UserValue.
1070613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  UserValue(const MDNode *var, unsigned o, LocMap::Allocator &alloc)
1080613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    : variable(var), offset(o), leader(this), next(0), locInts(alloc)
1090613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  {}
1100613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
1110613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// getLeader - Get the leader of this value's equivalence class.
1120613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  UserValue *getLeader() {
1130613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    UserValue *l = leader;
1140613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    while (l != l->leader)
1150613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      l = l->leader;
1160613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    return leader = l;
1170613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
1180613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
1190613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// getNext - Return the next UserValue in the equivalence class.
1200613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  UserValue *getNext() const { return next; }
1210613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
1220613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// match - Does this UserValue match the aprameters?
1230613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  bool match(const MDNode *Var, unsigned Offset) const {
1240613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    return Var == variable && Offset == offset;
1250613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
1260613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
1270613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// merge - Merge equivalence classes.
1280613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  static UserValue *merge(UserValue *L1, UserValue *L2) {
1290613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    L2 = L2->getLeader();
1300613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (!L1)
1310613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      return L2;
1320613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    L1 = L1->getLeader();
1330613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (L1 == L2)
1340613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      return L1;
1350613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    // Splice L2 before L1's members.
1360613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    UserValue *End = L2;
1370613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    while (End->next)
1380613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      End->leader = L1, End = End->next;
1390613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    End->leader = L1;
1400613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    End->next = L1->next;
1410613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    L1->next = L2;
1420613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    return L1;
1430613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
1440613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
1450613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// getLocationNo - Return the location number that matches Loc.
1460804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  unsigned getLocationNo(const MachineOperand &LocMO) {
1470804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    if (LocMO.isReg() && LocMO.getReg() == 0)
1480613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      return ~0u;
1490804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    for (unsigned i = 0, e = locations.size(); i != e; ++i)
1500804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen      if (LocMO.isIdenticalTo(locations[i]))
1510804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen        return i;
1520804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    locations.push_back(LocMO);
1530804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    // We are storing a MachineOperand outside a MachineInstr.
1540804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    locations.back().clearParent();
1550804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    return locations.size() - 1;
1560613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
1570613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
1580613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// addDef - Add a definition point to this value.
1590613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  void addDef(SlotIndex Idx, const MachineOperand &LocMO) {
1600613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    // Add a singular (Idx,Idx) -> Loc mapping.
1610613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    LocMap::iterator I = locInts.find(Idx);
1620613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (!I.valid() || I.start() != Idx)
1630613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      I.insert(Idx, Idx.getNextSlot(), getLocationNo(LocMO));
1640613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
1650613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
1660613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// extendDef - Extend the current definition as far as possible down the
1670613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// dominator tree. Stop when meeting an existing def or when leaving the live
1680613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// range of VNI.
1690613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @param Idx   Starting point for the definition.
1700613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @param LocNo Location number to propagate.
1710613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @param LI    Restrict liveness to where LI has the value VNI. May be null.
1720613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @param VNI   When LI is not null, this is the value to restrict to.
1730613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @param LIS   Live intervals analysis.
1740613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @param MDT   Dominator tree.
1750613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  void extendDef(SlotIndex Idx, unsigned LocNo,
1760613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen                 LiveInterval *LI, const VNInfo *VNI,
1770613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen                 LiveIntervals &LIS, MachineDominatorTree &MDT);
1780613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
1790613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// computeIntervals - Compute the live intervals of all locations after
1800613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// collecting all their def points.
1810613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  void computeIntervals(LiveIntervals &LIS, MachineDominatorTree &MDT);
1820613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
18330e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen  /// renameRegister - Update locations to rewrite OldReg as NewReg:SubIdx.
18430e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen  void renameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx,
18530e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen                      const TargetRegisterInfo *TRI);
18630e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen
18742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  /// rewriteLocations - Rewrite virtual register locations according to the
18842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  /// provided virtual register map.
18942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  void rewriteLocations(VirtRegMap &VRM, const TargetRegisterInfo &TRI);
19042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
19142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  /// emitDebugVariables - Recreate DBG_VALUE instruction from data structures.
19242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  void emitDebugValues(VirtRegMap *VRM,
19342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen                       LiveIntervals &LIS, const TargetInstrInfo &TRI);
19442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
1950613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  void print(raw_ostream&, const TargetRegisterInfo*);
1960613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen};
1970613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen} // namespace
1980613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
1990613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// LDVImpl - Implementation of the LiveDebugVariables pass.
2000613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesennamespace {
2010613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenclass LDVImpl {
2020613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  LiveDebugVariables &pass;
2030613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  LocMap::Allocator allocator;
2040613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  MachineFunction *MF;
2050613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  LiveIntervals *LIS;
2060613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  MachineDominatorTree *MDT;
2070613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  const TargetRegisterInfo *TRI;
2080613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2090613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// userValues - All allocated UserValue instances.
2100613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  SmallVector<UserValue*, 8> userValues;
2110613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2120613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// Map virtual register to eq class leader.
2130613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  typedef DenseMap<unsigned, UserValue*> VRMap;
2146ed4c6af97db8b2bbfd6b54dd2a58f16cf0c592bJakob Stoklund Olesen  VRMap virtRegToEqClass;
2150613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2160613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// Map user variable to eq class leader.
2170613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  typedef DenseMap<const MDNode *, UserValue*> UVMap;
2180613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  UVMap userVarMap;
2190613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2200613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// getUserValue - Find or create a UserValue.
2210613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  UserValue *getUserValue(const MDNode *Var, unsigned Offset);
2220613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
22330e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen  /// lookupVirtReg - Find the EC leader for VirtReg or null.
22430e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen  UserValue *lookupVirtReg(unsigned VirtReg);
22530e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen
2260613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// mapVirtReg - Map virtual register to an equivalence class.
2270613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  void mapVirtReg(unsigned VirtReg, UserValue *EC);
2280613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2290613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// handleDebugValue - Add DBG_VALUE instruction to our maps.
2300613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @param MI  DBG_VALUE instruction
2310613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @param Idx Last valid SLotIndex before instruction.
2320613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @return    True if the DBG_VALUE instruction should be deleted.
2330613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  bool handleDebugValue(MachineInstr *MI, SlotIndex Idx);
2340613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2350613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// collectDebugValues - Collect and erase all DBG_VALUE instructions, adding
2360613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// a UserValue def for each instruction.
2370613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @param mf MachineFunction to be scanned.
2380613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @return True if any debug values were found.
2390613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  bool collectDebugValues(MachineFunction &mf);
2400613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2410613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// computeIntervals - Compute the live intervals of all user values after
2420613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// collecting all their def points.
2430613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  void computeIntervals();
2440613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2450613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenpublic:
2460613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  LDVImpl(LiveDebugVariables *ps) : pass(*ps) {}
2470613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  bool runOnMachineFunction(MachineFunction &mf);
2480613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2490613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// clear - Relase all memory.
2500613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  void clear() {
2510613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    DeleteContainerPointers(userValues);
2520613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    userValues.clear();
2536ed4c6af97db8b2bbfd6b54dd2a58f16cf0c592bJakob Stoklund Olesen    virtRegToEqClass.clear();
2540613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    userVarMap.clear();
2550613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
2560613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
25730e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen  /// renameRegister - Replace all references to OldReg wiht NewReg:SubIdx.
25830e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen  void renameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx);
25930e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen
26042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  /// emitDebugVariables - Recreate DBG_VALUE instruction from data structures.
26142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  void emitDebugValues(VirtRegMap *VRM);
26242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
2630613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  void print(raw_ostream&);
2640613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen};
2650613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen} // namespace
2660613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2670613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid UserValue::print(raw_ostream &OS, const TargetRegisterInfo *TRI) {
2680613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  if (const MDString *MDS = dyn_cast<MDString>(variable->getOperand(2)))
2690613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    OS << "!\"" << MDS->getString() << "\"\t";
2700613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  if (offset)
2710613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    OS << '+' << offset;
2720613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  for (LocMap::const_iterator I = locInts.begin(); I.valid(); ++I) {
2730613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    OS << " [" << I.start() << ';' << I.stop() << "):";
2740613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (I.value() == ~0u)
2750613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      OS << "undef";
2760613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    else
2770613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      OS << I.value();
2780613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
2790804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  for (unsigned i = 0, e = locations.size(); i != e; ++i)
2800804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    OS << " Loc" << i << '=' << locations[i];
2810613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  OS << '\n';
2820613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
2830613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2840613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid LDVImpl::print(raw_ostream &OS) {
2850613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  OS << "********** DEBUG VARIABLES **********\n";
2860613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  for (unsigned i = 0, e = userValues.size(); i != e; ++i)
2870613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    userValues[i]->print(OS, TRI);
2880613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
2890613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2905daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesenvoid UserValue::coalesceLocation(unsigned LocNo) {
2910804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  unsigned KeepLoc = 0;
2920804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  for (unsigned e = locations.size(); KeepLoc != e; ++KeepLoc) {
2930804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    if (KeepLoc == LocNo)
2940804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen      continue;
2950804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    if (locations[KeepLoc].isIdenticalTo(locations[LocNo]))
2960804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen      break;
2975daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  }
2980804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  // No matches.
2990804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  if (KeepLoc == locations.size())
3000804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    return;
3010804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen
3020804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  // Keep the smaller location, erase the larger one.
3030804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  unsigned EraseLoc = LocNo;
3040804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  if (KeepLoc > EraseLoc)
3050804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    std::swap(KeepLoc, EraseLoc);
3065daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  locations.erase(locations.begin() + EraseLoc);
3075daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen
3085daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  // Rewrite values.
3095daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  for (LocMap::iterator I = locInts.begin(); I.valid(); ++I) {
3105daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen    unsigned v = I.value();
3115daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen    if (v == EraseLoc)
3125daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen      I.setValue(KeepLoc);      // Coalesce when possible.
3135daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen    else if (v > EraseLoc)
3145daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen      I.setValueUnchecked(v-1); // Avoid coalescing with untransformed values.
3155daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  }
3165daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen}
3175daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen
3180613516b16466a92c68d60734801221506c85e86Jakob Stoklund OlesenUserValue *LDVImpl::getUserValue(const MDNode *Var, unsigned Offset) {
3190613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  UserValue *&Leader = userVarMap[Var];
3200613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  if (Leader) {
3210613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    UserValue *UV = Leader->getLeader();
3220613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    Leader = UV;
3230613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    for (; UV; UV = UV->getNext())
3240613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      if (UV->match(Var, Offset))
3250613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        return UV;
3260613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
3270613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
3280613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  UserValue *UV = new UserValue(Var, Offset, allocator);
3290613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  userValues.push_back(UV);
3300613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  Leader = UserValue::merge(Leader, UV);
3310613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  return UV;
3320613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
3330613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
3340613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid LDVImpl::mapVirtReg(unsigned VirtReg, UserValue *EC) {
3350613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  assert(TargetRegisterInfo::isVirtualRegister(VirtReg) && "Only map VirtRegs");
3366ed4c6af97db8b2bbfd6b54dd2a58f16cf0c592bJakob Stoklund Olesen  UserValue *&Leader = virtRegToEqClass[VirtReg];
3370613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  Leader = UserValue::merge(Leader, EC);
3380613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
3390613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
34030e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund OlesenUserValue *LDVImpl::lookupVirtReg(unsigned VirtReg) {
3416ed4c6af97db8b2bbfd6b54dd2a58f16cf0c592bJakob Stoklund Olesen  if (UserValue *UV = virtRegToEqClass.lookup(VirtReg))
34230e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen    return UV->getLeader();
34330e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen  return 0;
34430e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen}
34530e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen
3460613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenbool LDVImpl::handleDebugValue(MachineInstr *MI, SlotIndex Idx) {
3470613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  // DBG_VALUE loc, offset, variable
3480613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  if (MI->getNumOperands() != 3 ||
3490613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      !MI->getOperand(1).isImm() || !MI->getOperand(2).isMetadata()) {
3500613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    DEBUG(dbgs() << "Can't handle " << *MI);
3510613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    return false;
3520613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
3530613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
3540613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  // Get or create the UserValue for (variable,offset).
3550613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  unsigned Offset = MI->getOperand(1).getImm();
3560613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  const MDNode *Var = MI->getOperand(2).getMetadata();
3570613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  UserValue *UV = getUserValue(Var, Offset);
3580613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
3590613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  // If the location is a virtual register, make sure it is mapped.
3600613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  if (MI->getOperand(0).isReg()) {
3610613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    unsigned Reg = MI->getOperand(0).getReg();
362c9df025e33ac435adb3b3318d237c36ca7cec659Jakob Stoklund Olesen    if (TargetRegisterInfo::isVirtualRegister(Reg))
3630613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      mapVirtReg(Reg, UV);
3640613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
3650613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
3660613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  UV->addDef(Idx, MI->getOperand(0));
3670613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  return true;
3680613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
3690613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
3700613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenbool LDVImpl::collectDebugValues(MachineFunction &mf) {
3710613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  bool Changed = false;
3720613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  for (MachineFunction::iterator MFI = mf.begin(), MFE = mf.end(); MFI != MFE;
3730613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen       ++MFI) {
3740613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    MachineBasicBlock *MBB = MFI;
3750613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    for (MachineBasicBlock::iterator MBBI = MBB->begin(), MBBE = MBB->end();
3760613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen         MBBI != MBBE;) {
3770613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      if (!MBBI->isDebugValue()) {
3780613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        ++MBBI;
3790613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        continue;
3800613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      }
3810613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      // DBG_VALUE has no slot index, use the previous instruction instead.
3820613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      SlotIndex Idx = MBBI == MBB->begin() ?
3830613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        LIS->getMBBStartIdx(MBB) :
3840613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        LIS->getInstructionIndex(llvm::prior(MBBI)).getDefIndex();
3850613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      // Handle consecutive DBG_VALUE instructions with the same slot index.
3860613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      do {
3870613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        if (handleDebugValue(MBBI, Idx)) {
3880613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen          MBBI = MBB->erase(MBBI);
3890613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen          Changed = true;
3900613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        } else
3910613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen          ++MBBI;
3920613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      } while (MBBI != MBBE && MBBI->isDebugValue());
3930613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    }
3940613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
3950613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  return Changed;
3960613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
3970613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
3980613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid UserValue::extendDef(SlotIndex Idx, unsigned LocNo,
3990613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen                          LiveInterval *LI, const VNInfo *VNI,
4000613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen                          LiveIntervals &LIS, MachineDominatorTree &MDT) {
4010613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  SmallVector<SlotIndex, 16> Todo;
4020613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  Todo.push_back(Idx);
4030613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4040613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  do {
4050613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    SlotIndex Start = Todo.pop_back_val();
4060613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    MachineBasicBlock *MBB = LIS.getMBBFromIndex(Start);
4070613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    SlotIndex Stop = LIS.getMBBEndIdx(MBB);
40812a40314a91511b65bc83782fd5a3e981331adb1Jakob Stoklund Olesen    LocMap::iterator I = locInts.find(Start);
4090613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4100613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    // Limit to VNI's live range.
4110613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    bool ToEnd = true;
4120613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (LI && VNI) {
4130613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      LiveRange *Range = LI->getLiveRangeContaining(Start);
4140613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      if (!Range || Range->valno != VNI)
4150613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        continue;
4160613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      if (Range->end < Stop)
4170613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        Stop = Range->end, ToEnd = false;
4180613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    }
4190613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4200613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    // There could already be a short def at Start.
4210613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (I.valid() && I.start() <= Start) {
4220613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      // Stop when meeting a different location or an already extended interval.
4230613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      Start = Start.getNextSlot();
4240613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      if (I.value() != LocNo || I.stop() != Start)
4250613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        continue;
4260613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      // This is a one-slot placeholder. Just skip it.
4270613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      ++I;
4280613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    }
4290613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4300613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    // Limited by the next def.
4310613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (I.valid() && I.start() < Stop)
4320613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      Stop = I.start(), ToEnd = false;
4330613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4340613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (Start >= Stop)
4350613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      continue;
4360613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4370613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    I.insert(Start, Stop, LocNo);
4380613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4390613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    // If we extended to the MBB end, propagate down the dominator tree.
4400613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (!ToEnd)
4410613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      continue;
4420613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    const std::vector<MachineDomTreeNode*> &Children =
4430613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      MDT.getNode(MBB)->getChildren();
4440613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    for (unsigned i = 0, e = Children.size(); i != e; ++i)
4450613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      Todo.push_back(LIS.getMBBStartIdx(Children[i]->getBlock()));
4460613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  } while (!Todo.empty());
4470613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
4480613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4490613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid
4500613516b16466a92c68d60734801221506c85e86Jakob Stoklund OlesenUserValue::computeIntervals(LiveIntervals &LIS, MachineDominatorTree &MDT) {
4510613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  SmallVector<std::pair<SlotIndex, unsigned>, 16> Defs;
4520613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4530613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  // Collect all defs to be extended (Skipping undefs).
4540613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  for (LocMap::const_iterator I = locInts.begin(); I.valid(); ++I)
4550613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (I.value() != ~0u)
4560613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      Defs.push_back(std::make_pair(I.start(), I.value()));
4570613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4580613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  for (unsigned i = 0, e = Defs.size(); i != e; ++i) {
4590613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    SlotIndex Idx = Defs[i].first;
4600613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    unsigned LocNo = Defs[i].second;
4610804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    const MachineOperand &Loc = locations[LocNo];
4620613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4630613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    // Register locations are constrained to where the register value is live.
4640804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    if (Loc.isReg() && LIS.hasInterval(Loc.getReg())) {
4650804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen      LiveInterval *LI = &LIS.getInterval(Loc.getReg());
4660613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      const VNInfo *VNI = LI->getVNInfoAt(Idx);
4670613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      extendDef(Idx, LocNo, LI, VNI, LIS, MDT);
4680613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    } else
4690613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      extendDef(Idx, LocNo, 0, 0, LIS, MDT);
4700613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
4710613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4720613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  // Finally, erase all the undefs.
4730613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  for (LocMap::iterator I = locInts.begin(); I.valid();)
4740613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (I.value() == ~0u)
4750613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      I.erase();
4760613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    else
4770613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      ++I;
4780613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
4790613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4800613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid LDVImpl::computeIntervals() {
4810613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  for (unsigned i = 0, e = userValues.size(); i != e; ++i)
4820613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    userValues[i]->computeIntervals(*LIS, *MDT);
4830613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
4840613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4850613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenbool LDVImpl::runOnMachineFunction(MachineFunction &mf) {
4860613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  MF = &mf;
4870613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  LIS = &pass.getAnalysis<LiveIntervals>();
4880613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  MDT = &pass.getAnalysis<MachineDominatorTree>();
4890613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  TRI = mf.getTarget().getRegisterInfo();
4900613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  clear();
4910613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  DEBUG(dbgs() << "********** COMPUTING LIVE DEBUG VARIABLES: "
4920613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen               << ((Value*)mf.getFunction())->getName()
4930613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen               << " **********\n");
4940613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4950613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  bool Changed = collectDebugValues(mf);
4960613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  computeIntervals();
4970613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  DEBUG(print(dbgs()));
4980613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  return Changed;
4990613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
5000613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
501bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesenbool LiveDebugVariables::runOnMachineFunction(MachineFunction &mf) {
50251a666f0e50a34b74212db9c5814153c885153a5Devang Patel  if (!EnableLDV)
50351a666f0e50a34b74212db9c5814153c885153a5Devang Patel    return false;
5040613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  if (!pImpl)
5050613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    pImpl = new LDVImpl(this);
5060613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  return static_cast<LDVImpl*>(pImpl)->runOnMachineFunction(mf);
5070613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
5080613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
5090613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid LiveDebugVariables::releaseMemory() {
5100613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  if (pImpl)
5110613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    static_cast<LDVImpl*>(pImpl)->clear();
5120613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
5130613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
5140613516b16466a92c68d60734801221506c85e86Jakob Stoklund OlesenLiveDebugVariables::~LiveDebugVariables() {
5150613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  if (pImpl)
5160613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    delete static_cast<LDVImpl*>(pImpl);
517bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen}
51830e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen
51930e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesenvoid UserValue::
52030e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund OlesenrenameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx,
52130e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen               const TargetRegisterInfo *TRI) {
5225daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  for (unsigned i = locations.size(); i; --i) {
5235daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen    unsigned LocNo = i - 1;
5240804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    MachineOperand &Loc = locations[LocNo];
5250804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    if (!Loc.isReg() || Loc.getReg() != OldReg)
52630e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen      continue;
5270804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    if (TargetRegisterInfo::isPhysicalRegister(NewReg))
5280804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen      Loc.substPhysReg(NewReg, *TRI);
5290804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    else
5300804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen      Loc.substVirtReg(NewReg, SubIdx, *TRI);
5315daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen    coalesceLocation(LocNo);
53230e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen  }
53330e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen}
53430e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen
53530e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesenvoid LDVImpl::
53630e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund OlesenrenameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx) {
5378d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen  UserValue *UV = lookupVirtReg(OldReg);
5388d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen  if (!UV)
5398d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen    return;
5408d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen
5418d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen  if (TargetRegisterInfo::isVirtualRegister(NewReg))
5428d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen    mapVirtReg(NewReg, UV);
5436ed4c6af97db8b2bbfd6b54dd2a58f16cf0c592bJakob Stoklund Olesen  virtRegToEqClass.erase(OldReg);
5448d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen
5458d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen  do {
54630e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen    UV->renameRegister(OldReg, NewReg, SubIdx, TRI);
5478d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen    UV = UV->getNext();
5488d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen  } while (UV);
54930e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen}
55030e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen
55130e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesenvoid LiveDebugVariables::
55230e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund OlesenrenameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx) {
55330e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen  if (pImpl)
55430e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen    static_cast<LDVImpl*>(pImpl)->renameRegister(OldReg, NewReg, SubIdx);
55530e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen}
55630e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen
55742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenvoid
55842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund OlesenUserValue::rewriteLocations(VirtRegMap &VRM, const TargetRegisterInfo &TRI) {
55942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  // Iterate over locations in reverse makes it easier to handle coalescing.
56042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  for (unsigned i = locations.size(); i ; --i) {
56142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    unsigned LocNo = i-1;
5620804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    MachineOperand &Loc = locations[LocNo];
56342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    // Only virtual registers are rewritten.
5640804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    if (!Loc.isReg() || !Loc.getReg() ||
5650804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen        !TargetRegisterInfo::isVirtualRegister(Loc.getReg()))
56642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      continue;
5670804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    unsigned VirtReg = Loc.getReg();
568f203627f21614cbef9526aa791b3e7b0493d1e41Jakob Stoklund Olesen    if (VRM.isAssignedReg(VirtReg) &&
569f203627f21614cbef9526aa791b3e7b0493d1e41Jakob Stoklund Olesen        TargetRegisterInfo::isPhysicalRegister(VRM.getPhys(VirtReg))) {
5700804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen      Loc.substPhysReg(VRM.getPhys(VirtReg), TRI);
571f0704d28f34b872f949ef8030651c7159ff6f32fJakob Stoklund Olesen    } else if (VRM.getStackSlot(VirtReg) != VirtRegMap::NO_STACK_SLOT &&
572f0704d28f34b872f949ef8030651c7159ff6f32fJakob Stoklund Olesen               VRM.isSpillSlotUsed(VRM.getStackSlot(VirtReg))) {
57342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      // FIXME: Translate SubIdx to a stackslot offset.
5740804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen      Loc = MachineOperand::CreateFI(VRM.getStackSlot(VirtReg));
57542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    } else {
5760804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen      Loc.setReg(0);
5770804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen      Loc.setSubReg(0);
57842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    }
5795daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen    coalesceLocation(LocNo);
58042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  }
58142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  DEBUG(print(dbgs(), &TRI));
58242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen}
58342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
58442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen/// findInsertLocation - Find an iterator and DebugLoc for inserting a DBG_VALUE
58542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen/// instruction.
58642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenstatic MachineBasicBlock::iterator
58742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund OlesenfindInsertLocation(MachineBasicBlock *MBB, SlotIndex Idx, DebugLoc &DL,
58842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen                   LiveIntervals &LIS) {
58942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  SlotIndex Start = LIS.getMBBStartIdx(MBB);
59042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  Idx = Idx.getBaseIndex();
59142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
592b08773749a42a8c68afca96360b6e361147779b4Jakob Stoklund Olesen  // Don't insert anything after the first terminator.
593b08773749a42a8c68afca96360b6e361147779b4Jakob Stoklund Olesen  MachineBasicBlock::iterator Term = MBB->getFirstTerminator();
594b08773749a42a8c68afca96360b6e361147779b4Jakob Stoklund Olesen  if (Term != MBB->end() && Idx >= LIS.getInstructionIndex(Term)) {
595b08773749a42a8c68afca96360b6e361147779b4Jakob Stoklund Olesen    DL = Term->getDebugLoc();
596b08773749a42a8c68afca96360b6e361147779b4Jakob Stoklund Olesen    return Term;
597b08773749a42a8c68afca96360b6e361147779b4Jakob Stoklund Olesen  }
598b08773749a42a8c68afca96360b6e361147779b4Jakob Stoklund Olesen
59942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  // Try to find an insert location by going backwards from Idx.
60042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  MachineInstr *MI;
60142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  while (!(MI = LIS.getInstructionFromIndex(Idx))) {
60242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    // We've reached the beginning of MBB.
60342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    if (Idx == Start) {
60442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      MachineBasicBlock::iterator I = MBB->SkipPHIsAndLabels(MBB->begin());
60542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      if (I != MBB->end())
60642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen        DL = I->getDebugLoc();
60742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      return I;
60842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    }
60942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    Idx = Idx.getPrevIndex();
61042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  }
61142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  // We found an instruction. The insert point is after the instr.
61242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  DL = MI->getDebugLoc();
61342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  return llvm::next(MachineBasicBlock::iterator(MI));
61442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen}
61542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
61642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenvoid UserValue::insertDebugValue(MachineBasicBlock *MBB, SlotIndex Idx,
61742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen                                 unsigned LocNo,
61842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen                                 LiveIntervals &LIS,
61942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen                                 const TargetInstrInfo &TII) {
62042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  DebugLoc DL;
62142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  MachineBasicBlock::iterator I = findInsertLocation(MBB, Idx, DL, LIS);
6220804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  MachineOperand &Loc = locations[LocNo];
62342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
62442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  // Frame index locations may require a target callback.
6250804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  if (Loc.isFI()) {
62642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    MachineInstr *MI = TII.emitFrameIndexDebugValue(*MBB->getParent(),
6270804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen                                          Loc.getIndex(), offset, variable, DL);
62842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    if (MI) {
62942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      MBB->insert(I, MI);
63042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      return;
63142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    }
63242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  }
63342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  // This is not a frame index, or the target is happy with a standard FI.
6340804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  BuildMI(*MBB, I, DL, TII.get(TargetOpcode::DBG_VALUE))
6350804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    .addOperand(Loc).addImm(offset).addMetadata(variable);
63642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen}
63742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
63842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenvoid UserValue::insertDebugKill(MachineBasicBlock *MBB, SlotIndex Idx,
63942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen                               LiveIntervals &LIS, const TargetInstrInfo &TII) {
64042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  DebugLoc DL;
64142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  MachineBasicBlock::iterator I = findInsertLocation(MBB, Idx, DL, LIS);
64242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  BuildMI(*MBB, I, DL, TII.get(TargetOpcode::DBG_VALUE)).addReg(0)
64342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    .addImm(offset).addMetadata(variable);
64442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen}
64542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
64642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenvoid UserValue::emitDebugValues(VirtRegMap *VRM, LiveIntervals &LIS,
64742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen                                const TargetInstrInfo &TII) {
64842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  MachineFunction::iterator MFEnd = VRM->getMachineFunction().end();
64942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
65042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  for (LocMap::const_iterator I = locInts.begin(); I.valid();) {
65142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    SlotIndex Start = I.start();
65242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    SlotIndex Stop = I.stop();
65342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    unsigned LocNo = I.value();
65442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    DEBUG(dbgs() << "\t[" << Start << ';' << Stop << "):" << LocNo);
65542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    MachineFunction::iterator MBB = LIS.getMBBFromIndex(Start);
65642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    SlotIndex MBBEnd = LIS.getMBBEndIdx(MBB);
65742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
65842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    DEBUG(dbgs() << " BB#" << MBB->getNumber() << '-' << MBBEnd);
65942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    insertDebugValue(MBB, Start, LocNo, LIS, TII);
66042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
66142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    // This interval may span multiple basic blocks.
66242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    // Insert a DBG_VALUE into each one.
66342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    while(Stop > MBBEnd) {
66442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      // Move to the next block.
66542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      Start = MBBEnd;
66642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      if (++MBB == MFEnd)
66742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen        break;
66842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      MBBEnd = LIS.getMBBEndIdx(MBB);
66942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      DEBUG(dbgs() << " BB#" << MBB->getNumber() << '-' << MBBEnd);
67042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      insertDebugValue(MBB, Start, LocNo, LIS, TII);
67142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    }
67242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    DEBUG(dbgs() << '\n');
67342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    if (MBB == MFEnd)
67442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      break;
67542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
67642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    ++I;
67742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    if (Stop == MBBEnd)
67842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      continue;
67942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    // The current interval ends before MBB.
68042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    // Insert a kill if there is a gap.
68142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    if (!I.valid() || I.start() > Stop)
68242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      insertDebugKill(MBB, Stop, LIS, TII);
68342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  }
68442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen}
68542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
68642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenvoid LDVImpl::emitDebugValues(VirtRegMap *VRM) {
68742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  DEBUG(dbgs() << "********** EMITTING LIVE DEBUG VARIABLES **********\n");
68842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  const TargetInstrInfo *TII = MF->getTarget().getInstrInfo();
68942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  for (unsigned i = 0, e = userValues.size(); i != e; ++i) {
69042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    userValues[i]->rewriteLocations(*VRM, *TRI);
69142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    userValues[i]->emitDebugValues(VRM, *LIS, *TII);
69242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  }
69342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen}
69442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
69542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenvoid LiveDebugVariables::emitDebugValues(VirtRegMap *VRM) {
69642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  if (pImpl)
69742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    static_cast<LDVImpl*>(pImpl)->emitDebugValues(VRM);
69842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen}
69942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
70042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
70130e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen#ifndef NDEBUG
70230e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesenvoid LiveDebugVariables::dump() {
70330e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen  if (pImpl)
70430e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen    static_cast<LDVImpl*>(pImpl)->print(dbgs());
70530e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen}
70630e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen#endif
70730e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen
708