LiveDebugVariables.cpp revision d9f3fc7faaa7686af3e1a004d86397da9c8e0449
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"
29ad90d3a343ca73c32693e2b05b74462ccd9659cdDevang Patel#include "llvm/ADT/Statistic.h"
30bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen#include "llvm/CodeGen/LiveIntervalAnalysis.h"
310613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#include "llvm/CodeGen/MachineDominators.h"
3242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen#include "llvm/CodeGen/MachineFunction.h"
3342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen#include "llvm/CodeGen/MachineInstrBuilder.h"
341744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen#include "llvm/CodeGen/MachineRegisterInfo.h"
35bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen#include "llvm/CodeGen/Passes.h"
360613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#include "llvm/Support/CommandLine.h"
370613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#include "llvm/Support/Debug.h"
3842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen#include "llvm/Target/TargetInstrInfo.h"
39bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen#include "llvm/Target/TargetMachine.h"
400613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#include "llvm/Target/TargetRegisterInfo.h"
41bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen
42bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesenusing namespace llvm;
43bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen
4451a666f0e50a34b74212db9c5814153c885153a5Devang Patelstatic cl::opt<bool>
4525dc2268a5aedcb5da57f065dbdb40d790b11bc0Jakob Stoklund OlesenEnableLDV("live-debug-variables", cl::init(true),
4651a666f0e50a34b74212db9c5814153c885153a5Devang Patel          cl::desc("Enable the live debug variables pass"), cl::Hidden);
4751a666f0e50a34b74212db9c5814153c885153a5Devang Patel
48ad90d3a343ca73c32693e2b05b74462ccd9659cdDevang PatelSTATISTIC(NumInsertedDebugValues, "Number of DBG_VALUEs inserted");
49bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesenchar LiveDebugVariables::ID = 0;
50bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen
51bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund OlesenINITIALIZE_PASS_BEGIN(LiveDebugVariables, "livedebugvars",
52bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen                "Debug Variable Analysis", false, false)
530613516b16466a92c68d60734801221506c85e86Jakob Stoklund OlesenINITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
54bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund OlesenINITIALIZE_PASS_DEPENDENCY(LiveIntervals)
55bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund OlesenINITIALIZE_PASS_END(LiveDebugVariables, "livedebugvars",
56bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen                "Debug Variable Analysis", false, false)
57bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen
58bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesenvoid LiveDebugVariables::getAnalysisUsage(AnalysisUsage &AU) const {
590613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  AU.addRequired<MachineDominatorTree>();
60bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen  AU.addRequiredTransitive<LiveIntervals>();
61bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen  AU.setPreservesAll();
62bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen  MachineFunctionPass::getAnalysisUsage(AU);
63bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen}
64bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen
650613516b16466a92c68d60734801221506c85e86Jakob Stoklund OlesenLiveDebugVariables::LiveDebugVariables() : MachineFunctionPass(ID), pImpl(0) {
66bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen  initializeLiveDebugVariablesPass(*PassRegistry::getPassRegistry());
67bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen}
68bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen
690613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// LocMap - Map of where a user value is live, and its location.
700613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesentypedef IntervalMap<SlotIndex, unsigned, 4> LocMap;
710613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
720613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// UserValue - A user value is a part of a debug info user variable.
730613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen///
740613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// A DBG_VALUE instruction notes that (a sub-register of) a virtual register
750613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// holds part of a user variable. The part is identified by a byte offset.
760613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen///
770613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// UserValues are grouped into equivalence classes for easier searching. Two
780613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// user values are related if they refer to the same variable, or if they are
790613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// held by the same virtual register. The equivalence class is the transitive
800613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// closure of that relation.
810613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesennamespace {
821744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesenclass LDVImpl;
830613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenclass UserValue {
840613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  const MDNode *variable; ///< The debug info variable we are part of.
850613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  unsigned offset;        ///< Byte offset into variable.
86f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel  DebugLoc dl;            ///< The debug location for the variable. This is
87f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel                          ///< used by dwarf writer to find lexical scope.
880613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  UserValue *leader;      ///< Equivalence class leader.
890613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  UserValue *next;        ///< Next value in equivalence class, or null.
900613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
910613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// Numbered locations referenced by locmap.
920804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  SmallVector<MachineOperand, 4> locations;
930613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
940613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// Map of slot indices where this value is live.
950613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  LocMap locInts;
960613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
975daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  /// coalesceLocation - After LocNo was changed, check if it has become
985daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  /// identical to another location, and coalesce them. This may cause LocNo or
995daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  /// a later location to be erased, but no earlier location will be erased.
1005daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  void coalesceLocation(unsigned LocNo);
1015daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen
10242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  /// insertDebugValue - Insert a DBG_VALUE into MBB at Idx for LocNo.
10342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  void insertDebugValue(MachineBasicBlock *MBB, SlotIndex Idx, unsigned LocNo,
10442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen                        LiveIntervals &LIS, const TargetInstrInfo &TII);
10542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
106f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  /// splitLocation - Replace OldLocNo ranges with NewRegs ranges where NewRegs
107f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  /// is live. Returns true if any changes were made.
108f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  bool splitLocation(unsigned OldLocNo, ArrayRef<LiveInterval*> NewRegs);
109f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
1100613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenpublic:
1110613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// UserValue - Create a new UserValue.
112f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  UserValue(const MDNode *var, unsigned o, DebugLoc L,
113f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel            LocMap::Allocator &alloc)
114f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel    : variable(var), offset(o), dl(L), leader(this), next(0), locInts(alloc)
1150613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  {}
1160613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
1170613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// getLeader - Get the leader of this value's equivalence class.
1180613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  UserValue *getLeader() {
1190613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    UserValue *l = leader;
1200613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    while (l != l->leader)
1210613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      l = l->leader;
1220613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    return leader = l;
1230613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
1240613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
1250613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// getNext - Return the next UserValue in the equivalence class.
1260613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  UserValue *getNext() const { return next; }
1270613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
128a462d6e8ebe90f3732891b02a057a88038ac1228Devang Patel  /// match - Does this UserValue match the parameters?
1290613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  bool match(const MDNode *Var, unsigned Offset) const {
1300613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    return Var == variable && Offset == offset;
1310613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
1320613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
1330613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// merge - Merge equivalence classes.
1340613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  static UserValue *merge(UserValue *L1, UserValue *L2) {
1350613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    L2 = L2->getLeader();
1360613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (!L1)
1370613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      return L2;
1380613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    L1 = L1->getLeader();
1390613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (L1 == L2)
1400613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      return L1;
1410613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    // Splice L2 before L1's members.
1420613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    UserValue *End = L2;
1430613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    while (End->next)
1440613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      End->leader = L1, End = End->next;
1450613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    End->leader = L1;
1460613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    End->next = L1->next;
1470613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    L1->next = L2;
1480613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    return L1;
1490613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
1500613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
1510613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// getLocationNo - Return the location number that matches Loc.
1520804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  unsigned getLocationNo(const MachineOperand &LocMO) {
1531744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    if (LocMO.isReg()) {
1541744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      if (LocMO.getReg() == 0)
1551744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen        return ~0u;
1561744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      // For register locations we dont care about use/def and other flags.
1571744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      for (unsigned i = 0, e = locations.size(); i != e; ++i)
1581744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen        if (locations[i].isReg() &&
1591744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen            locations[i].getReg() == LocMO.getReg() &&
1601744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen            locations[i].getSubReg() == LocMO.getSubReg())
1611744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen          return i;
1621744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    } else
1631744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      for (unsigned i = 0, e = locations.size(); i != e; ++i)
1641744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen        if (LocMO.isIdenticalTo(locations[i]))
1651744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen          return i;
1660804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    locations.push_back(LocMO);
1670804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    // We are storing a MachineOperand outside a MachineInstr.
1680804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    locations.back().clearParent();
1691744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    // Don't store def operands.
1701744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    if (locations.back().isReg())
1711744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      locations.back().setIsUse();
1720804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    return locations.size() - 1;
1730613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
1740613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
1751744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  /// mapVirtRegs - Ensure that all virtual register locations are mapped.
1761744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  void mapVirtRegs(LDVImpl *LDV);
1771744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen
1780613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// addDef - Add a definition point to this value.
1790613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  void addDef(SlotIndex Idx, const MachineOperand &LocMO) {
1800613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    // Add a singular (Idx,Idx) -> Loc mapping.
1810613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    LocMap::iterator I = locInts.find(Idx);
1820613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (!I.valid() || I.start() != Idx)
1830613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      I.insert(Idx, Idx.getNextSlot(), getLocationNo(LocMO));
18479513ed8598bd5ebc25b0764961f326d34aaf388Jakob Stoklund Olesen    else
18579513ed8598bd5ebc25b0764961f326d34aaf388Jakob Stoklund Olesen      // A later DBG_VALUE at the same SlotIndex overrides the old location.
18679513ed8598bd5ebc25b0764961f326d34aaf388Jakob Stoklund Olesen      I.setValue(getLocationNo(LocMO));
1870613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
1880613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
1890613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// extendDef - Extend the current definition as far as possible down the
1900613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// dominator tree. Stop when meeting an existing def or when leaving the live
1910613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// range of VNI.
1921744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  /// End points where VNI is no longer live are added to Kills.
1930613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @param Idx   Starting point for the definition.
1940613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @param LocNo Location number to propagate.
1950613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @param LI    Restrict liveness to where LI has the value VNI. May be null.
1960613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @param VNI   When LI is not null, this is the value to restrict to.
1971744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  /// @param Kills Append end points of VNI's live range to Kills.
1980613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @param LIS   Live intervals analysis.
1990613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @param MDT   Dominator tree.
2000613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  void extendDef(SlotIndex Idx, unsigned LocNo,
2010613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen                 LiveInterval *LI, const VNInfo *VNI,
2021744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen                 SmallVectorImpl<SlotIndex> *Kills,
2030613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen                 LiveIntervals &LIS, MachineDominatorTree &MDT);
2040613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2051744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  /// addDefsFromCopies - The value in LI/LocNo may be copies to other
2061744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  /// registers. Determine if any of the copies are available at the kill
2071744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  /// points, and add defs if possible.
2081744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  /// @param LI      Scan for copies of the value in LI->reg.
2091744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  /// @param LocNo   Location number of LI->reg.
2101744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  /// @param Kills   Points where the range of LocNo could be extended.
2111744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  /// @param NewDefs Append (Idx, LocNo) of inserted defs here.
2121744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  void addDefsFromCopies(LiveInterval *LI, unsigned LocNo,
2131744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen                      const SmallVectorImpl<SlotIndex> &Kills,
2141744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen                      SmallVectorImpl<std::pair<SlotIndex, unsigned> > &NewDefs,
2151744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen                      MachineRegisterInfo &MRI,
2161744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen                      LiveIntervals &LIS);
2171744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen
2180613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// computeIntervals - Compute the live intervals of all locations after
2190613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// collecting all their def points.
2201744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  void computeIntervals(MachineRegisterInfo &MRI,
2211744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen                        LiveIntervals &LIS, MachineDominatorTree &MDT);
2220613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
22330e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen  /// renameRegister - Update locations to rewrite OldReg as NewReg:SubIdx.
22430e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen  void renameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx,
22530e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen                      const TargetRegisterInfo *TRI);
22630e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen
227f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  /// splitRegister - Replace OldReg ranges with NewRegs ranges where NewRegs is
228f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  /// live. Returns true if any changes were made.
229f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  bool splitRegister(unsigned OldLocNo, ArrayRef<LiveInterval*> NewRegs);
230f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
23142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  /// rewriteLocations - Rewrite virtual register locations according to the
23242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  /// provided virtual register map.
23342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  void rewriteLocations(VirtRegMap &VRM, const TargetRegisterInfo &TRI);
23442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
23542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  /// emitDebugVariables - Recreate DBG_VALUE instruction from data structures.
23642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  void emitDebugValues(VirtRegMap *VRM,
23742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen                       LiveIntervals &LIS, const TargetInstrInfo &TRI);
23842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
239f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel  /// findDebugLoc - Return DebugLoc used for this DBG_VALUE instruction. A
240f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel  /// variable may have more than one corresponding DBG_VALUE instructions.
241f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel  /// Only first one needs DebugLoc to identify variable's lexical scope
242f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel  /// in source file.
243f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel  DebugLoc findDebugLoc();
244e77150bbcbf1f53b3830904be4d243c618c00b14Jakob Stoklund Olesen  void print(raw_ostream&, const TargetMachine*);
2450613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen};
2460613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen} // namespace
2470613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2480613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// LDVImpl - Implementation of the LiveDebugVariables pass.
2490613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesennamespace {
2500613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenclass LDVImpl {
2510613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  LiveDebugVariables &pass;
2520613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  LocMap::Allocator allocator;
2530613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  MachineFunction *MF;
2540613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  LiveIntervals *LIS;
2550613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  MachineDominatorTree *MDT;
2560613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  const TargetRegisterInfo *TRI;
2570613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2580613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// userValues - All allocated UserValue instances.
2590613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  SmallVector<UserValue*, 8> userValues;
2600613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2610613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// Map virtual register to eq class leader.
2620613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  typedef DenseMap<unsigned, UserValue*> VRMap;
2636ed4c6af97db8b2bbfd6b54dd2a58f16cf0c592bJakob Stoklund Olesen  VRMap virtRegToEqClass;
2640613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2650613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// Map user variable to eq class leader.
2660613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  typedef DenseMap<const MDNode *, UserValue*> UVMap;
2670613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  UVMap userVarMap;
2680613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2690613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// getUserValue - Find or create a UserValue.
270f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel  UserValue *getUserValue(const MDNode *Var, unsigned Offset, DebugLoc DL);
2710613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
27230e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen  /// lookupVirtReg - Find the EC leader for VirtReg or null.
27330e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen  UserValue *lookupVirtReg(unsigned VirtReg);
27430e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen
2750613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// handleDebugValue - Add DBG_VALUE instruction to our maps.
2760613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @param MI  DBG_VALUE instruction
2770613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @param Idx Last valid SLotIndex before instruction.
2780613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @return    True if the DBG_VALUE instruction should be deleted.
2790613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  bool handleDebugValue(MachineInstr *MI, SlotIndex Idx);
2800613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2810613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// collectDebugValues - Collect and erase all DBG_VALUE instructions, adding
2820613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// a UserValue def for each instruction.
2830613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @param mf MachineFunction to be scanned.
2840613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// @return True if any debug values were found.
2850613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  bool collectDebugValues(MachineFunction &mf);
2860613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2870613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// computeIntervals - Compute the live intervals of all user values after
2880613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// collecting all their def points.
2890613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  void computeIntervals();
2900613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2910613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenpublic:
2920613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  LDVImpl(LiveDebugVariables *ps) : pass(*ps) {}
2930613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  bool runOnMachineFunction(MachineFunction &mf);
2940613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
2950613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  /// clear - Relase all memory.
2960613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  void clear() {
2970613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    DeleteContainerPointers(userValues);
2980613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    userValues.clear();
2996ed4c6af97db8b2bbfd6b54dd2a58f16cf0c592bJakob Stoklund Olesen    virtRegToEqClass.clear();
3000613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    userVarMap.clear();
3010613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
3020613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
3031744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  /// mapVirtReg - Map virtual register to an equivalence class.
3041744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  void mapVirtReg(unsigned VirtReg, UserValue *EC);
3051744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen
3067a2bdde0a0eebcd2125055e0eacaca040f0b766cChris Lattner  /// renameRegister - Replace all references to OldReg with NewReg:SubIdx.
30730e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen  void renameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx);
30830e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen
309f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  /// splitRegister -  Replace all references to OldReg with NewRegs.
310f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  void splitRegister(unsigned OldReg, ArrayRef<LiveInterval*> NewRegs);
311f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
31242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  /// emitDebugVariables - Recreate DBG_VALUE instruction from data structures.
31342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  void emitDebugValues(VirtRegMap *VRM);
31442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
3150613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  void print(raw_ostream&);
3160613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen};
3170613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen} // namespace
3180613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
319e77150bbcbf1f53b3830904be4d243c618c00b14Jakob Stoklund Olesenvoid UserValue::print(raw_ostream &OS, const TargetMachine *TM) {
3200613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  if (const MDString *MDS = dyn_cast<MDString>(variable->getOperand(2)))
3210613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    OS << "!\"" << MDS->getString() << "\"\t";
3220613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  if (offset)
3230613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    OS << '+' << offset;
3240613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  for (LocMap::const_iterator I = locInts.begin(); I.valid(); ++I) {
3250613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    OS << " [" << I.start() << ';' << I.stop() << "):";
3260613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (I.value() == ~0u)
3270613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      OS << "undef";
3280613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    else
3290613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      OS << I.value();
3300613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
331e77150bbcbf1f53b3830904be4d243c618c00b14Jakob Stoklund Olesen  for (unsigned i = 0, e = locations.size(); i != e; ++i) {
332e77150bbcbf1f53b3830904be4d243c618c00b14Jakob Stoklund Olesen    OS << " Loc" << i << '=';
333e77150bbcbf1f53b3830904be4d243c618c00b14Jakob Stoklund Olesen    locations[i].print(OS, TM);
334e77150bbcbf1f53b3830904be4d243c618c00b14Jakob Stoklund Olesen  }
3350613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  OS << '\n';
3360613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
3370613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
3380613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid LDVImpl::print(raw_ostream &OS) {
3390613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  OS << "********** DEBUG VARIABLES **********\n";
3400613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  for (unsigned i = 0, e = userValues.size(); i != e; ++i)
341e77150bbcbf1f53b3830904be4d243c618c00b14Jakob Stoklund Olesen    userValues[i]->print(OS, &MF->getTarget());
3420613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
3430613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
3445daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesenvoid UserValue::coalesceLocation(unsigned LocNo) {
3450804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  unsigned KeepLoc = 0;
3460804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  for (unsigned e = locations.size(); KeepLoc != e; ++KeepLoc) {
3470804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    if (KeepLoc == LocNo)
3480804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen      continue;
3490804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    if (locations[KeepLoc].isIdenticalTo(locations[LocNo]))
3500804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen      break;
3515daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  }
3520804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  // No matches.
3530804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  if (KeepLoc == locations.size())
3540804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    return;
3550804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen
3560804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  // Keep the smaller location, erase the larger one.
3570804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  unsigned EraseLoc = LocNo;
3580804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  if (KeepLoc > EraseLoc)
3590804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    std::swap(KeepLoc, EraseLoc);
3605daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  locations.erase(locations.begin() + EraseLoc);
3615daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen
3625daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  // Rewrite values.
3635daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  for (LocMap::iterator I = locInts.begin(); I.valid(); ++I) {
3645daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen    unsigned v = I.value();
3655daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen    if (v == EraseLoc)
3665daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen      I.setValue(KeepLoc);      // Coalesce when possible.
3675daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen    else if (v > EraseLoc)
3685daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen      I.setValueUnchecked(v-1); // Avoid coalescing with untransformed values.
3695daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  }
3705daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen}
3715daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen
3721744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesenvoid UserValue::mapVirtRegs(LDVImpl *LDV) {
3731744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  for (unsigned i = 0, e = locations.size(); i != e; ++i)
3741744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    if (locations[i].isReg() &&
3751744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen        TargetRegisterInfo::isVirtualRegister(locations[i].getReg()))
3761744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      LDV->mapVirtReg(locations[i].getReg(), this);
3771744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen}
3781744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen
379f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang PatelUserValue *LDVImpl::getUserValue(const MDNode *Var, unsigned Offset,
380f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel                                 DebugLoc DL) {
3810613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  UserValue *&Leader = userVarMap[Var];
3820613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  if (Leader) {
3830613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    UserValue *UV = Leader->getLeader();
3840613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    Leader = UV;
3850613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    for (; UV; UV = UV->getNext())
3860613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      if (UV->match(Var, Offset))
3870613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        return UV;
3880613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
3890613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
390f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel  UserValue *UV = new UserValue(Var, Offset, DL, allocator);
3910613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  userValues.push_back(UV);
3920613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  Leader = UserValue::merge(Leader, UV);
3930613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  return UV;
3940613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
3950613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
3960613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid LDVImpl::mapVirtReg(unsigned VirtReg, UserValue *EC) {
3970613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  assert(TargetRegisterInfo::isVirtualRegister(VirtReg) && "Only map VirtRegs");
3986ed4c6af97db8b2bbfd6b54dd2a58f16cf0c592bJakob Stoklund Olesen  UserValue *&Leader = virtRegToEqClass[VirtReg];
3990613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  Leader = UserValue::merge(Leader, EC);
4000613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
4010613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
40230e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund OlesenUserValue *LDVImpl::lookupVirtReg(unsigned VirtReg) {
4036ed4c6af97db8b2bbfd6b54dd2a58f16cf0c592bJakob Stoklund Olesen  if (UserValue *UV = virtRegToEqClass.lookup(VirtReg))
40430e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen    return UV->getLeader();
40530e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen  return 0;
40630e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen}
40730e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen
4080613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenbool LDVImpl::handleDebugValue(MachineInstr *MI, SlotIndex Idx) {
4090613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  // DBG_VALUE loc, offset, variable
4100613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  if (MI->getNumOperands() != 3 ||
4110613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      !MI->getOperand(1).isImm() || !MI->getOperand(2).isMetadata()) {
4120613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    DEBUG(dbgs() << "Can't handle " << *MI);
4130613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    return false;
4140613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
4150613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4160613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  // Get or create the UserValue for (variable,offset).
4170613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  unsigned Offset = MI->getOperand(1).getImm();
4180613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  const MDNode *Var = MI->getOperand(2).getMetadata();
419f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel  UserValue *UV = getUserValue(Var, Offset, MI->getDebugLoc());
4200613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  UV->addDef(Idx, MI->getOperand(0));
4210613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  return true;
4220613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
4230613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4240613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenbool LDVImpl::collectDebugValues(MachineFunction &mf) {
4250613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  bool Changed = false;
4260613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  for (MachineFunction::iterator MFI = mf.begin(), MFE = mf.end(); MFI != MFE;
4270613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen       ++MFI) {
4280613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    MachineBasicBlock *MBB = MFI;
4290613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    for (MachineBasicBlock::iterator MBBI = MBB->begin(), MBBE = MBB->end();
4300613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen         MBBI != MBBE;) {
4310613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      if (!MBBI->isDebugValue()) {
4320613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        ++MBBI;
4330613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        continue;
4340613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      }
4350613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      // DBG_VALUE has no slot index, use the previous instruction instead.
4360613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      SlotIndex Idx = MBBI == MBB->begin() ?
4370613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        LIS->getMBBStartIdx(MBB) :
4380613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        LIS->getInstructionIndex(llvm::prior(MBBI)).getDefIndex();
4390613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      // Handle consecutive DBG_VALUE instructions with the same slot index.
4400613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      do {
4410613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        if (handleDebugValue(MBBI, Idx)) {
4420613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen          MBBI = MBB->erase(MBBI);
4430613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen          Changed = true;
4440613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        } else
4450613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen          ++MBBI;
4460613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      } while (MBBI != MBBE && MBBI->isDebugValue());
4470613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    }
4480613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
4490613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  return Changed;
4500613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
4510613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4520613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid UserValue::extendDef(SlotIndex Idx, unsigned LocNo,
4530613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen                          LiveInterval *LI, const VNInfo *VNI,
4541744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen                          SmallVectorImpl<SlotIndex> *Kills,
4550613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen                          LiveIntervals &LIS, MachineDominatorTree &MDT) {
4560613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  SmallVector<SlotIndex, 16> Todo;
4570613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  Todo.push_back(Idx);
4580613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4590613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  do {
4600613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    SlotIndex Start = Todo.pop_back_val();
4610613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    MachineBasicBlock *MBB = LIS.getMBBFromIndex(Start);
4620613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    SlotIndex Stop = LIS.getMBBEndIdx(MBB);
46312a40314a91511b65bc83782fd5a3e981331adb1Jakob Stoklund Olesen    LocMap::iterator I = locInts.find(Start);
4640613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4650613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    // Limit to VNI's live range.
4660613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    bool ToEnd = true;
4670613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (LI && VNI) {
4680613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      LiveRange *Range = LI->getLiveRangeContaining(Start);
4691744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      if (!Range || Range->valno != VNI) {
4701744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen        if (Kills)
4711744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen          Kills->push_back(Start);
4720613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        continue;
4731744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      }
4740613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      if (Range->end < Stop)
4750613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        Stop = Range->end, ToEnd = false;
4760613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    }
4770613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4780613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    // There could already be a short def at Start.
4790613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (I.valid() && I.start() <= Start) {
4800613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      // Stop when meeting a different location or an already extended interval.
4810613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      Start = Start.getNextSlot();
4820613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      if (I.value() != LocNo || I.stop() != Start)
4830613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen        continue;
4840613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      // This is a one-slot placeholder. Just skip it.
4850613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      ++I;
4860613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    }
4870613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4880613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    // Limited by the next def.
4890613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (I.valid() && I.start() < Stop)
4900613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      Stop = I.start(), ToEnd = false;
4911744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    // Limited by VNI's live range.
4921744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    else if (!ToEnd && Kills)
4931744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      Kills->push_back(Stop);
4940613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4950613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (Start >= Stop)
4960613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      continue;
4970613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
4980613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    I.insert(Start, Stop, LocNo);
4990613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
5000613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    // If we extended to the MBB end, propagate down the dominator tree.
5010613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (!ToEnd)
5020613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      continue;
5030613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    const std::vector<MachineDomTreeNode*> &Children =
5040613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      MDT.getNode(MBB)->getChildren();
5050613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    for (unsigned i = 0, e = Children.size(); i != e; ++i)
5060613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      Todo.push_back(LIS.getMBBStartIdx(Children[i]->getBlock()));
5070613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  } while (!Todo.empty());
5080613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
5090613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
5100613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid
5111744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund OlesenUserValue::addDefsFromCopies(LiveInterval *LI, unsigned LocNo,
5121744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen                      const SmallVectorImpl<SlotIndex> &Kills,
5131744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen                      SmallVectorImpl<std::pair<SlotIndex, unsigned> > &NewDefs,
5141744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen                      MachineRegisterInfo &MRI, LiveIntervals &LIS) {
5151744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  if (Kills.empty())
5161744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    return;
5171744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  // Don't track copies from physregs, there are too many uses.
5181744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  if (!TargetRegisterInfo::isVirtualRegister(LI->reg))
5191744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    return;
5201744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen
5211744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  // Collect all the (vreg, valno) pairs that are copies of LI.
5221744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  SmallVector<std::pair<LiveInterval*, const VNInfo*>, 8> CopyValues;
5231744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  for (MachineRegisterInfo::use_nodbg_iterator
5241744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen         UI = MRI.use_nodbg_begin(LI->reg),
5251744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen         UE = MRI.use_nodbg_end(); UI != UE; ++UI) {
5261744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    // Copies of the full value.
5271744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    if (UI.getOperand().getSubReg() || !UI->isCopy())
5281744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      continue;
5291744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    MachineInstr *MI = &*UI;
5301744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    unsigned DstReg = MI->getOperand(0).getReg();
5311744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen
53228cf1156c93afabedc69fe7b73aa92ce85e323a5Jakob Stoklund Olesen    // Don't follow copies to physregs. These are usually setting up call
53328cf1156c93afabedc69fe7b73aa92ce85e323a5Jakob Stoklund Olesen    // arguments, and the argument registers are always call clobbered. We are
53428cf1156c93afabedc69fe7b73aa92ce85e323a5Jakob Stoklund Olesen    // better off in the source register which could be a callee-saved register,
53528cf1156c93afabedc69fe7b73aa92ce85e323a5Jakob Stoklund Olesen    // or it could be spilled.
53628cf1156c93afabedc69fe7b73aa92ce85e323a5Jakob Stoklund Olesen    if (!TargetRegisterInfo::isVirtualRegister(DstReg))
53728cf1156c93afabedc69fe7b73aa92ce85e323a5Jakob Stoklund Olesen      continue;
53828cf1156c93afabedc69fe7b73aa92ce85e323a5Jakob Stoklund Olesen
5391744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    // Is LocNo extended to reach this copy? If not, another def may be blocking
5401744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    // it, or we are looking at a wrong value of LI.
5411744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    SlotIndex Idx = LIS.getInstructionIndex(MI);
5421744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    LocMap::iterator I = locInts.find(Idx.getUseIndex());
5431744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    if (!I.valid() || I.value() != LocNo)
5441744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      continue;
5451744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen
5461744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    if (!LIS.hasInterval(DstReg))
5471744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      continue;
5481744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    LiveInterval *DstLI = &LIS.getInterval(DstReg);
5491744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    const VNInfo *DstVNI = DstLI->getVNInfoAt(Idx.getDefIndex());
5501744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    assert(DstVNI && DstVNI->def == Idx.getDefIndex() && "Bad copy value");
5511744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    CopyValues.push_back(std::make_pair(DstLI, DstVNI));
5521744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  }
5531744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen
5541744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  if (CopyValues.empty())
5551744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    return;
5561744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen
5571744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  DEBUG(dbgs() << "Got " << CopyValues.size() << " copies of " << *LI << '\n');
5581744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen
5591744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  // Try to add defs of the copied values for each kill point.
5601744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  for (unsigned i = 0, e = Kills.size(); i != e; ++i) {
5611744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    SlotIndex Idx = Kills[i];
5621744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    for (unsigned j = 0, e = CopyValues.size(); j != e; ++j) {
5631744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      LiveInterval *DstLI = CopyValues[j].first;
5641744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      const VNInfo *DstVNI = CopyValues[j].second;
5651744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      if (DstLI->getVNInfoAt(Idx) != DstVNI)
5661744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen        continue;
5671744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      // Check that there isn't already a def at Idx
5681744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      LocMap::iterator I = locInts.find(Idx);
5691744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      if (I.valid() && I.start() <= Idx)
5701744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen        continue;
5711744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      DEBUG(dbgs() << "Kill at " << Idx << " covered by valno #"
5721744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen                   << DstVNI->id << " in " << *DstLI << '\n');
5731744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      MachineInstr *CopyMI = LIS.getInstructionFromIndex(DstVNI->def);
5741744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      assert(CopyMI && CopyMI->isCopy() && "Bad copy value");
5751744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      unsigned LocNo = getLocationNo(CopyMI->getOperand(0));
5761744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      I.insert(Idx, Idx.getNextSlot(), LocNo);
5771744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      NewDefs.push_back(std::make_pair(Idx, LocNo));
5781744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      break;
5791744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    }
5801744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  }
5811744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen}
5821744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen
5831744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesenvoid
5841744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund OlesenUserValue::computeIntervals(MachineRegisterInfo &MRI,
5851744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen                            LiveIntervals &LIS,
5861744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen                            MachineDominatorTree &MDT) {
5870613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  SmallVector<std::pair<SlotIndex, unsigned>, 16> Defs;
5880613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
5890613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  // Collect all defs to be extended (Skipping undefs).
5900613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  for (LocMap::const_iterator I = locInts.begin(); I.valid(); ++I)
5910613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (I.value() != ~0u)
5920613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      Defs.push_back(std::make_pair(I.start(), I.value()));
5930613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
5941744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  // Extend all defs, and possibly add new ones along the way.
5951744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  for (unsigned i = 0; i != Defs.size(); ++i) {
5960613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    SlotIndex Idx = Defs[i].first;
5970613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    unsigned LocNo = Defs[i].second;
5980804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    const MachineOperand &Loc = locations[LocNo];
5990613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
6000613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    // Register locations are constrained to where the register value is live.
6010804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    if (Loc.isReg() && LIS.hasInterval(Loc.getReg())) {
6020804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen      LiveInterval *LI = &LIS.getInterval(Loc.getReg());
6030613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      const VNInfo *VNI = LI->getVNInfoAt(Idx);
6041744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      SmallVector<SlotIndex, 16> Kills;
6051744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      extendDef(Idx, LocNo, LI, VNI, &Kills, LIS, MDT);
6061744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      addDefsFromCopies(LI, LocNo, Kills, Defs, MRI, LIS);
6070613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    } else
6081744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen      extendDef(Idx, LocNo, 0, 0, 0, LIS, MDT);
6090613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  }
6100613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
6110613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  // Finally, erase all the undefs.
6120613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  for (LocMap::iterator I = locInts.begin(); I.valid();)
6130613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    if (I.value() == ~0u)
6140613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      I.erase();
6150613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    else
6160613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen      ++I;
6170613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
6180613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
6190613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid LDVImpl::computeIntervals() {
6201744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  for (unsigned i = 0, e = userValues.size(); i != e; ++i) {
6211744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    userValues[i]->computeIntervals(MF->getRegInfo(), *LIS, *MDT);
6221744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen    userValues[i]->mapVirtRegs(this);
6231744e476ec3df0350a1163bf2c6439ea21aefbbaJakob Stoklund Olesen  }
6240613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
6250613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
6260613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenbool LDVImpl::runOnMachineFunction(MachineFunction &mf) {
6270613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  MF = &mf;
6280613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  LIS = &pass.getAnalysis<LiveIntervals>();
6290613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  MDT = &pass.getAnalysis<MachineDominatorTree>();
6300613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  TRI = mf.getTarget().getRegisterInfo();
6310613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  clear();
6320613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  DEBUG(dbgs() << "********** COMPUTING LIVE DEBUG VARIABLES: "
6330613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen               << ((Value*)mf.getFunction())->getName()
6340613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen               << " **********\n");
6350613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
6360613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  bool Changed = collectDebugValues(mf);
6370613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  computeIntervals();
6380613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  DEBUG(print(dbgs()));
6390613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  return Changed;
6400613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
6410613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
642bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesenbool LiveDebugVariables::runOnMachineFunction(MachineFunction &mf) {
64351a666f0e50a34b74212db9c5814153c885153a5Devang Patel  if (!EnableLDV)
64451a666f0e50a34b74212db9c5814153c885153a5Devang Patel    return false;
6450613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  if (!pImpl)
6460613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    pImpl = new LDVImpl(this);
6470613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  return static_cast<LDVImpl*>(pImpl)->runOnMachineFunction(mf);
6480613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
6490613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
6500613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid LiveDebugVariables::releaseMemory() {
6510613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  if (pImpl)
6520613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    static_cast<LDVImpl*>(pImpl)->clear();
6530613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}
6540613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen
6550613516b16466a92c68d60734801221506c85e86Jakob Stoklund OlesenLiveDebugVariables::~LiveDebugVariables() {
6560613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen  if (pImpl)
6570613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen    delete static_cast<LDVImpl*>(pImpl);
658bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen}
65930e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen
66030e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesenvoid UserValue::
66130e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund OlesenrenameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx,
66230e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen               const TargetRegisterInfo *TRI) {
6635daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen  for (unsigned i = locations.size(); i; --i) {
6645daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen    unsigned LocNo = i - 1;
6650804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    MachineOperand &Loc = locations[LocNo];
6660804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    if (!Loc.isReg() || Loc.getReg() != OldReg)
66730e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen      continue;
6680804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    if (TargetRegisterInfo::isPhysicalRegister(NewReg))
6690804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen      Loc.substPhysReg(NewReg, *TRI);
6700804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    else
6710804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen      Loc.substVirtReg(NewReg, SubIdx, *TRI);
6725daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen    coalesceLocation(LocNo);
67330e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen  }
67430e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen}
67530e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen
67630e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesenvoid LDVImpl::
67730e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund OlesenrenameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx) {
6788d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen  UserValue *UV = lookupVirtReg(OldReg);
6798d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen  if (!UV)
6808d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen    return;
6818d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen
6828d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen  if (TargetRegisterInfo::isVirtualRegister(NewReg))
6838d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen    mapVirtReg(NewReg, UV);
6846ed4c6af97db8b2bbfd6b54dd2a58f16cf0c592bJakob Stoklund Olesen  virtRegToEqClass.erase(OldReg);
6858d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen
6868d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen  do {
68730e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen    UV->renameRegister(OldReg, NewReg, SubIdx, TRI);
6888d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen    UV = UV->getNext();
6898d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen  } while (UV);
69030e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen}
69130e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen
69230e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesenvoid LiveDebugVariables::
69330e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund OlesenrenameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx) {
69430e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen  if (pImpl)
69530e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen    static_cast<LDVImpl*>(pImpl)->renameRegister(OldReg, NewReg, SubIdx);
69630e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen}
69730e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen
698f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen//===----------------------------------------------------------------------===//
699f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen//                           Live Range Splitting
700f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen//===----------------------------------------------------------------------===//
701f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
702f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesenbool
703f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund OlesenUserValue::splitLocation(unsigned OldLocNo, ArrayRef<LiveInterval*> NewRegs) {
704f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  DEBUG({
705f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    dbgs() << "Splitting Loc" << OldLocNo << '\t';
706f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    print(dbgs(), 0);
707f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  });
708f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  bool DidChange = false;
709f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  LocMap::iterator LocMapI;
710f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  LocMapI.setMap(locInts);
711f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  for (unsigned i = 0; i != NewRegs.size(); ++i) {
712f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    LiveInterval *LI = NewRegs[i];
713f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    if (LI->empty())
714f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      continue;
715f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
716f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    // Don't allocate the new LocNo until it is needed.
717f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    unsigned NewLocNo = ~0u;
718f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
719f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    // Iterate over the overlaps between locInts and LI.
720f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    LocMapI.find(LI->beginIndex());
721f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    if (!LocMapI.valid())
722f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      continue;
723f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    LiveInterval::iterator LII = LI->advanceTo(LI->begin(), LocMapI.start());
724f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    LiveInterval::iterator LIE = LI->end();
725f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    while (LocMapI.valid() && LII != LIE) {
726f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      // At this point, we know that LocMapI.stop() > LII->start.
727f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      LII = LI->advanceTo(LII, LocMapI.start());
728f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      if (LII == LIE)
729f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        break;
730f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
731f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      // Now LII->end > LocMapI.start(). Do we have an overlap?
732f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      if (LocMapI.value() == OldLocNo && LII->start < LocMapI.stop()) {
733f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        // Overlapping correct location. Allocate NewLocNo now.
734f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        if (NewLocNo == ~0u) {
735f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          MachineOperand MO = MachineOperand::CreateReg(LI->reg, false);
736f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          MO.setSubReg(locations[OldLocNo].getSubReg());
737f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          NewLocNo = getLocationNo(MO);
738f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          DidChange = true;
739f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        }
740f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
741f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        SlotIndex LStart = LocMapI.start();
742f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        SlotIndex LStop  = LocMapI.stop();
743f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
744f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        // Trim LocMapI down to the LII overlap.
745f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        if (LStart < LII->start)
746f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          LocMapI.setStartUnchecked(LII->start);
747f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        if (LStop > LII->end)
748f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          LocMapI.setStopUnchecked(LII->end);
749f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
750f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        // Change the value in the overlap. This may trigger coalescing.
751f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        LocMapI.setValue(NewLocNo);
752f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
753f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        // Re-insert any removed OldLocNo ranges.
754f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        if (LStart < LocMapI.start()) {
755f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          LocMapI.insert(LStart, LocMapI.start(), OldLocNo);
756f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          ++LocMapI;
757f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          assert(LocMapI.valid() && "Unexpected coalescing");
758f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        }
759f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        if (LStop > LocMapI.stop()) {
760f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          ++LocMapI;
761f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          LocMapI.insert(LII->end, LStop, OldLocNo);
762f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          --LocMapI;
763f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        }
764f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      }
765f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
766f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      // Advance to the next overlap.
767f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      if (LII->end < LocMapI.stop()) {
768f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        if (++LII == LIE)
769f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          break;
770f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        LocMapI.advanceTo(LII->start);
771f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      } else {
772f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        ++LocMapI;
773f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        if (!LocMapI.valid())
774f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen          break;
775f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        LII = LI->advanceTo(LII, LocMapI.start());
776f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      }
777f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    }
778f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  }
779f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
780f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  // Finally, remove any remaining OldLocNo intervals and OldLocNo itself.
781f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  locations.erase(locations.begin() + OldLocNo);
782f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  LocMapI.goToBegin();
783f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  while (LocMapI.valid()) {
784f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    unsigned v = LocMapI.value();
785f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    if (v == OldLocNo) {
786f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      DEBUG(dbgs() << "Erasing [" << LocMapI.start() << ';'
787f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen                   << LocMapI.stop() << ")\n");
788f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      LocMapI.erase();
789f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    } else {
790f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      if (v > OldLocNo)
791f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen        LocMapI.setValueUnchecked(v-1);
792f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      ++LocMapI;
793f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    }
794f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  }
795f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
796f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  DEBUG({dbgs() << "Split result: \t"; print(dbgs(), 0);});
797f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  return DidChange;
798f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen}
799f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
800f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesenbool
801f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund OlesenUserValue::splitRegister(unsigned OldReg, ArrayRef<LiveInterval*> NewRegs) {
802f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  bool DidChange = false;
8036212f9a304d7f8061c87920d39bddbc19afecb0cJakob Stoklund Olesen  // Split locations referring to OldReg. Iterate backwards so splitLocation can
8046212f9a304d7f8061c87920d39bddbc19afecb0cJakob Stoklund Olesen  // safely erase unuused locations.
8056212f9a304d7f8061c87920d39bddbc19afecb0cJakob Stoklund Olesen  for (unsigned i = locations.size(); i ; --i) {
8066212f9a304d7f8061c87920d39bddbc19afecb0cJakob Stoklund Olesen    unsigned LocNo = i-1;
807f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    const MachineOperand *Loc = &locations[LocNo];
808f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    if (!Loc->isReg() || Loc->getReg() != OldReg)
809f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen      continue;
810f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    DidChange |= splitLocation(LocNo, NewRegs);
811f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  }
812f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  return DidChange;
813f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen}
814f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
815f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesenvoid LDVImpl::splitRegister(unsigned OldReg, ArrayRef<LiveInterval*> NewRegs) {
816f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  bool DidChange = false;
817f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  for (UserValue *UV = lookupVirtReg(OldReg); UV; UV = UV->getNext())
818f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    DidChange |= UV->splitRegister(OldReg, NewRegs);
819f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
820f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  if (!DidChange)
821f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    return;
822f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
823f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  // Map all of the new virtual registers.
824f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  UserValue *UV = lookupVirtReg(OldReg);
825f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  for (unsigned i = 0; i != NewRegs.size(); ++i)
826f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    mapVirtReg(NewRegs[i]->reg, UV);
827f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen}
828f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
829f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesenvoid LiveDebugVariables::
830f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund OlesensplitRegister(unsigned OldReg, ArrayRef<LiveInterval*> NewRegs) {
831f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen  if (pImpl)
832f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen    static_cast<LDVImpl*>(pImpl)->splitRegister(OldReg, NewRegs);
833f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen}
834f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen
83542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenvoid
83642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund OlesenUserValue::rewriteLocations(VirtRegMap &VRM, const TargetRegisterInfo &TRI) {
83742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  // Iterate over locations in reverse makes it easier to handle coalescing.
83842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  for (unsigned i = locations.size(); i ; --i) {
83942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    unsigned LocNo = i-1;
8400804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    MachineOperand &Loc = locations[LocNo];
84142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    // Only virtual registers are rewritten.
8420804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    if (!Loc.isReg() || !Loc.getReg() ||
8430804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen        !TargetRegisterInfo::isVirtualRegister(Loc.getReg()))
84442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      continue;
8450804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    unsigned VirtReg = Loc.getReg();
846f203627f21614cbef9526aa791b3e7b0493d1e41Jakob Stoklund Olesen    if (VRM.isAssignedReg(VirtReg) &&
847f203627f21614cbef9526aa791b3e7b0493d1e41Jakob Stoklund Olesen        TargetRegisterInfo::isPhysicalRegister(VRM.getPhys(VirtReg))) {
848cf724f078623e786fc92335fdb0ec70b46f2e86dJakob Stoklund Olesen      // This can create a %noreg operand in rare cases when the sub-register
849cf724f078623e786fc92335fdb0ec70b46f2e86dJakob Stoklund Olesen      // index is no longer available. That means the user value is in a
850cf724f078623e786fc92335fdb0ec70b46f2e86dJakob Stoklund Olesen      // non-existent sub-register, and %noreg is exactly what we want.
8510804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen      Loc.substPhysReg(VRM.getPhys(VirtReg), TRI);
852f0704d28f34b872f949ef8030651c7159ff6f32fJakob Stoklund Olesen    } else if (VRM.getStackSlot(VirtReg) != VirtRegMap::NO_STACK_SLOT &&
853f0704d28f34b872f949ef8030651c7159ff6f32fJakob Stoklund Olesen               VRM.isSpillSlotUsed(VRM.getStackSlot(VirtReg))) {
85442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      // FIXME: Translate SubIdx to a stackslot offset.
8550804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen      Loc = MachineOperand::CreateFI(VRM.getStackSlot(VirtReg));
85642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    } else {
8570804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen      Loc.setReg(0);
8580804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen      Loc.setSubReg(0);
85942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    }
8605daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen    coalesceLocation(LocNo);
86142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  }
86242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen}
86342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
864f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel/// findInsertLocation - Find an iterator for inserting a DBG_VALUE
86542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen/// instruction.
86642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenstatic MachineBasicBlock::iterator
867f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang PatelfindInsertLocation(MachineBasicBlock *MBB, SlotIndex Idx,
86842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen                   LiveIntervals &LIS) {
86942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  SlotIndex Start = LIS.getMBBStartIdx(MBB);
87042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  Idx = Idx.getBaseIndex();
87142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
87242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  // Try to find an insert location by going backwards from Idx.
87342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  MachineInstr *MI;
87442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  while (!(MI = LIS.getInstructionFromIndex(Idx))) {
87542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    // We've reached the beginning of MBB.
87642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    if (Idx == Start) {
87742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      MachineBasicBlock::iterator I = MBB->SkipPHIsAndLabels(MBB->begin());
87842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      return I;
87942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    }
88042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    Idx = Idx.getPrevIndex();
88142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  }
882f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel
883eea666f216ad3a8f8cd88a969176f86add7228f3Jakob Stoklund Olesen  // Don't insert anything after the first terminator, though.
884eea666f216ad3a8f8cd88a969176f86add7228f3Jakob Stoklund Olesen  return MI->getDesc().isTerminator() ? MBB->getFirstTerminator() :
885eea666f216ad3a8f8cd88a969176f86add7228f3Jakob Stoklund Olesen                                    llvm::next(MachineBasicBlock::iterator(MI));
88642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen}
88742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
888f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang PatelDebugLoc UserValue::findDebugLoc() {
889f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel  DebugLoc D = dl;
890f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel  dl = DebugLoc();
891f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel  return D;
892f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel}
89342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenvoid UserValue::insertDebugValue(MachineBasicBlock *MBB, SlotIndex Idx,
89442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen                                 unsigned LocNo,
89542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen                                 LiveIntervals &LIS,
89642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen                                 const TargetInstrInfo &TII) {
897f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel  MachineBasicBlock::iterator I = findInsertLocation(MBB, Idx, LIS);
8980804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  MachineOperand &Loc = locations[LocNo];
899d9f3fc7faaa7686af3e1a004d86397da9c8e0449Devang Patel  ++NumInsertedDebugValues;
90042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
90142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  // Frame index locations may require a target callback.
9020804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen  if (Loc.isFI()) {
90342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    MachineInstr *MI = TII.emitFrameIndexDebugValue(*MBB->getParent(),
904f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel                                          Loc.getIndex(), offset, variable,
905f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel                                                    findDebugLoc());
90642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    if (MI) {
90742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      MBB->insert(I, MI);
90842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      return;
90942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    }
91042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  }
91142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  // This is not a frame index, or the target is happy with a standard FI.
912f827cd717b63fd3f1d9ad16e69087c65e9af8c82Devang Patel  BuildMI(*MBB, I, findDebugLoc(), TII.get(TargetOpcode::DBG_VALUE))
9130804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen    .addOperand(Loc).addImm(offset).addMetadata(variable);
91442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen}
91542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
91642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenvoid UserValue::emitDebugValues(VirtRegMap *VRM, LiveIntervals &LIS,
91742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen                                const TargetInstrInfo &TII) {
91842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  MachineFunction::iterator MFEnd = VRM->getMachineFunction().end();
91942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
92042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  for (LocMap::const_iterator I = locInts.begin(); I.valid();) {
92142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    SlotIndex Start = I.start();
92242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    SlotIndex Stop = I.stop();
92342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    unsigned LocNo = I.value();
92442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    DEBUG(dbgs() << "\t[" << Start << ';' << Stop << "):" << LocNo);
92542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    MachineFunction::iterator MBB = LIS.getMBBFromIndex(Start);
92642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    SlotIndex MBBEnd = LIS.getMBBEndIdx(MBB);
92742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
92842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    DEBUG(dbgs() << " BB#" << MBB->getNumber() << '-' << MBBEnd);
92942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    insertDebugValue(MBB, Start, LocNo, LIS, TII);
93042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    // This interval may span multiple basic blocks.
93142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    // Insert a DBG_VALUE into each one.
93242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    while(Stop > MBBEnd) {
93342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      // Move to the next block.
93442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      Start = MBBEnd;
93542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      if (++MBB == MFEnd)
93642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen        break;
93742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      MBBEnd = LIS.getMBBEndIdx(MBB);
93842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      DEBUG(dbgs() << " BB#" << MBB->getNumber() << '-' << MBBEnd);
93942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      insertDebugValue(MBB, Start, LocNo, LIS, TII);
94042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    }
94142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    DEBUG(dbgs() << '\n');
94242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    if (MBB == MFEnd)
94342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen      break;
94442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
94542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    ++I;
94642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  }
94742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen}
94842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
94942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenvoid LDVImpl::emitDebugValues(VirtRegMap *VRM) {
95042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  DEBUG(dbgs() << "********** EMITTING LIVE DEBUG VARIABLES **********\n");
95142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  const TargetInstrInfo *TII = MF->getTarget().getInstrInfo();
95242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  for (unsigned i = 0, e = userValues.size(); i != e; ++i) {
953cf724f078623e786fc92335fdb0ec70b46f2e86dJakob Stoklund Olesen    DEBUG(userValues[i]->print(dbgs(), &MF->getTarget()));
95442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    userValues[i]->rewriteLocations(*VRM, *TRI);
95542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    userValues[i]->emitDebugValues(VRM, *LIS, *TII);
95642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  }
95742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen}
95842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
95942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenvoid LiveDebugVariables::emitDebugValues(VirtRegMap *VRM) {
96042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen  if (pImpl)
96142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen    static_cast<LDVImpl*>(pImpl)->emitDebugValues(VRM);
96242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen}
96342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
96442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen
96530e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen#ifndef NDEBUG
96630e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesenvoid LiveDebugVariables::dump() {
96730e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen  if (pImpl)
96830e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen    static_cast<LDVImpl*>(pImpl)->print(dbgs());
96930e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen}
97030e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen#endif
97130e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen
972