LiveIntervalAnalysis.cpp revision ad7ccf34b5de14bd2b9ddc8072d14582a2ce29d9
1a3b8b5c0e0a1d0942288568b2012592184ca67c5Chris Lattner//===-- LiveIntervalAnalysis.cpp - Live Interval Analysis -----------------===//
2ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos//
3ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos//                     The LLVM Compiler Infrastructure
4ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos//
5ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos// This file was developed by the LLVM research group and is distributed under
6ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos// the University of Illinois Open Source License. See LICENSE.TXT for details.
7ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos//
8ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos//===----------------------------------------------------------------------===//
9ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos//
10ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos// This file implements the LiveInterval analysis pass which is used
11ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos// by the Linear Scan Register allocator. This pass linearizes the
12ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos// basic blocks of the function in DFS order and uses the
13ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos// LiveVariables pass to conservatively compute live intervals for
14ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos// each virtual and physical register.
15ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos//
16ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos//===----------------------------------------------------------------------===//
17ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
18ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos#define DEBUG_TYPE "liveintervals"
193c3fe462f7978b429ecdd71750c26be25c3d1335Chris Lattner#include "llvm/CodeGen/LiveIntervalAnalysis.h"
2008a6c7614be9793754b17930ba619e875aef9585Misha Brukman#include "VirtRegMap.h"
21015959ee38e4fd4a920f6b0065c50e524762f580Chris Lattner#include "llvm/Value.h"
226b4edbaaf9021e0434f0ce0c3724eb43ed41b770Alkis Evlogimenos#include "llvm/Analysis/LoopInfo.h"
23ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos#include "llvm/CodeGen/LiveVariables.h"
24ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos#include "llvm/CodeGen/MachineFrameInfo.h"
25ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos#include "llvm/CodeGen/MachineInstr.h"
26ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos#include "llvm/CodeGen/Passes.h"
27ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos#include "llvm/CodeGen/SSARegMap.h"
28ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos#include "llvm/Target/MRegisterInfo.h"
29ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos#include "llvm/Target/TargetInstrInfo.h"
30ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos#include "llvm/Target/TargetMachine.h"
31551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/CommandLine.h"
32551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/Debug.h"
33551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/ADT/Statistic.h"
34551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/ADT/STLExtras.h"
3520aa474f8fbebde588edc101b90e834df28ce4ceAlkis Evlogimenos#include <algorithm>
3697af751deb9b26fd42fbcee082da9ccc4ded5b45Jeff Cohen#include <cmath>
37ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenosusing namespace llvm;
38ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
39cd3245ac45c595da96bb768a55cddc356dff55feChris LattnerSTATISTIC(numIntervals, "Number of original intervals");
40cd3245ac45c595da96bb768a55cddc356dff55feChris LattnerSTATISTIC(numIntervalsAfter, "Number of intervals after coalescing");
41cd3245ac45c595da96bb768a55cddc356dff55feChris LattnerSTATISTIC(numJoins    , "Number of interval joins performed");
42cd3245ac45c595da96bb768a55cddc356dff55feChris LattnerSTATISTIC(numPeep     , "Number of identity moves eliminated after coalescing");
43cd3245ac45c595da96bb768a55cddc356dff55feChris LattnerSTATISTIC(numFolded   , "Number of loads/stores folded into instructions");
44ba1a3df608a14ca37ca944f4c942c202e919ea80Evan ChengSTATISTIC(numAborts   , "Number of times interval joining aborted");
45cd3245ac45c595da96bb768a55cddc356dff55feChris Lattner
46ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenosnamespace {
475d8925c7c506a54ebdfb0bc93437ec9f602eaaa0Chris Lattner  RegisterPass<LiveIntervals> X("liveintervals", "Live Interval Analysis");
48ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
49ed41f1bb1981a98eea63f00c5988cf62bbdd7c59Andrew Lenharth  static cl::opt<bool>
501a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  EnableJoining("join-liveintervals",
51428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner                cl::desc("Coallesce copies (default=true)"),
521a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos                cl::init(true));
532638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng
542638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng  static cl::opt<bool>
552638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng  EnableReMat("enable-rematerialization",
562638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng                cl::desc("Perform trivial re-materialization"),
572638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng                cl::init(false));
58d74ea2bbd8bb630331f35ead42d385249bd42af8Chris Lattner}
59ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
60f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattnervoid LiveIntervals::getAnalysisUsage(AnalysisUsage &AU) const {
611a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  AU.addRequired<LiveVariables>();
621a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  AU.addPreservedID(PHIEliminationID);
631a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  AU.addRequiredID(PHIEliminationID);
641a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  AU.addRequiredID(TwoAddressInstructionPassID);
651a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  AU.addRequired<LoopInfo>();
661a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  MachineFunctionPass::getAnalysisUsage(AU);
67ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos}
68ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
69f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattnervoid LiveIntervals::releaseMemory() {
701a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  mi2iMap_.clear();
711a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  i2miMap_.clear();
721a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  r2iMap_.clear();
731a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  r2rMap_.clear();
7488d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng  JoinedLIs.clear();
7508cec00588ec1a8fa85b208555f006d7396ae7a4Alkis Evlogimenos}
7608cec00588ec1a8fa85b208555f006d7396ae7a4Alkis Evlogimenos
7708cec00588ec1a8fa85b208555f006d7396ae7a4Alkis Evlogimenos
78993141402f57b4d4cbb7f8a3113f19c61688f9b7Evan Chengstatic bool isZeroLengthInterval(LiveInterval *li) {
79993141402f57b4d4cbb7f8a3113f19c61688f9b7Evan Cheng  for (LiveInterval::Ranges::const_iterator
80993141402f57b4d4cbb7f8a3113f19c61688f9b7Evan Cheng         i = li->ranges.begin(), e = li->ranges.end(); i != e; ++i)
81993141402f57b4d4cbb7f8a3113f19c61688f9b7Evan Cheng    if (i->end - i->start > LiveIntervals::InstrSlots::NUM)
82993141402f57b4d4cbb7f8a3113f19c61688f9b7Evan Cheng      return false;
83993141402f57b4d4cbb7f8a3113f19c61688f9b7Evan Cheng  return true;
84993141402f57b4d4cbb7f8a3113f19c61688f9b7Evan Cheng}
85993141402f57b4d4cbb7f8a3113f19c61688f9b7Evan Cheng
86993141402f57b4d4cbb7f8a3113f19c61688f9b7Evan Cheng
87ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos/// runOnMachineFunction - Register allocate the whole function
88ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos///
89ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenosbool LiveIntervals::runOnMachineFunction(MachineFunction &fn) {
901a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  mf_ = &fn;
911a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  tm_ = &fn.getTarget();
921a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  mri_ = tm_->getRegisterInfo();
93f768bba43f5c036039851d2fcca8212edca18467Chris Lattner  tii_ = tm_->getInstrInfo();
941a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  lv_ = &getAnalysis<LiveVariables>();
955327801fb87e3eda52a33f82e6211181030ecb93Alkis Evlogimenos  allocatableRegs_ = mri_->getAllocatableSet(fn);
962c4f7b5faaeedd97058ec4cfa44177124c42b9e1Alkis Evlogimenos  r2rMap_.grow(mf_->getSSARegMap()->getLastVirtReg());
971a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
98428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner  // Number MachineInstrs and MachineBasicBlocks.
99428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner  // Initialize MBB indexes to a sentinal.
100428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner  MBB2IdxMap.resize(mf_->getNumBlockIDs(), ~0U);
101428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner
102428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner  unsigned MIIndex = 0;
103428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner  for (MachineFunction::iterator MBB = mf_->begin(), E = mf_->end();
104428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner       MBB != E; ++MBB) {
105428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner    // Set the MBB2IdxMap entry for this MBB.
106428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner    MBB2IdxMap[MBB->getNumber()] = MIIndex;
1070c9f92e1ff64ee56724eae444a0442b02f83d0a8Evan Cheng
108428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner    for (MachineBasicBlock::iterator I = MBB->begin(), E = MBB->end();
109428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner         I != E; ++I) {
110428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner      bool inserted = mi2iMap_.insert(std::make_pair(I, MIIndex)).second;
1111a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      assert(inserted && "multiple MachineInstr -> index mappings");
112428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner      i2miMap_.push_back(I);
113428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner      MIIndex += InstrSlots::NUM;
1141a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    }
115428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner  }
116ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
1171a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  computeIntervals();
118ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
1191a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  numIntervals += getNumIntervals();
120843b160a2040b3ec4d3452678450afa11704c473Alkis Evlogimenos
121bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << "********** INTERVALS **********\n";
122bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  for (iterator I = begin(), E = end(); I != E; ++I) {
123bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    I->second.print(DOUT, mri_);
124bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    DOUT << "\n";
125bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  }
1267ac2d3146a196fa0120c579ecd2ddd69652ad230Chris Lattner
127428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner  // Join (coallesce) intervals if requested.
1281a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  if (EnableJoining) joinIntervals();
1291a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
1301a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  numIntervalsAfter += getNumIntervals();
131428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner
1321a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
1331a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // perform a final pass over the instructions and compute spill
134fbecc5a593da0a5b4d9ff6be63c5558060e31e43Chris Lattner  // weights, coalesce virtual registers and remove identity moves.
135428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner  const LoopInfo &loopInfo = getAnalysis<LoopInfo>();
1361a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
1371a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  for (MachineFunction::iterator mbbi = mf_->begin(), mbbe = mf_->end();
1381a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos       mbbi != mbbe; ++mbbi) {
1391a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    MachineBasicBlock* mbb = mbbi;
1401a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    unsigned loopDepth = loopInfo.getLoopDepth(mbb->getBasicBlock());
1411a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
1421a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    for (MachineBasicBlock::iterator mii = mbb->begin(), mie = mbb->end();
1431a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos         mii != mie; ) {
1441a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // if the move will be an identity move delete it
1451a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      unsigned srcReg, dstReg, RegRep;
146f768bba43f5c036039851d2fcca8212edca18467Chris Lattner      if (tii_->isMoveInstr(*mii, srcReg, dstReg) &&
1471a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos          (RegRep = rep(srcReg)) == rep(dstReg)) {
1481a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        // remove from def list
149b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng        LiveInterval &RegInt = getOrCreateInterval(RegRep);
150b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng        MachineOperand *MO = mii->findRegisterDefOperand(dstReg);
151b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng        // If def of this move instruction is dead, remove its live range from
152b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng        // the dstination register's live interval.
153b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng        if (MO->isDead()) {
154b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng          unsigned MoveIdx = getDefIndex(getInstructionIndex(mii));
155b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng          LiveInterval::iterator MLR = RegInt.FindLiveRangeContaining(MoveIdx);
156b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng          RegInt.removeRange(MLR->start, MoveIdx+1);
157b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng          if (RegInt.empty())
158b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng            removeInterval(RegRep);
159b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng        }
160f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner        RemoveMachineInstrFromMaps(mii);
1611a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        mii = mbbi->erase(mii);
1621a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        ++numPeep;
1632638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng      } else {
164fbecc5a593da0a5b4d9ff6be63c5558060e31e43Chris Lattner        for (unsigned i = 0, e = mii->getNumOperands(); i != e; ++i) {
165fbecc5a593da0a5b4d9ff6be63c5558060e31e43Chris Lattner          const MachineOperand &mop = mii->getOperand(i);
1661a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos          if (mop.isRegister() && mop.getReg() &&
1671a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos              MRegisterInfo::isVirtualRegister(mop.getReg())) {
1681a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos            // replace register with representative register
1691a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos            unsigned reg = rep(mop.getReg());
170e53f4a055f74bded20d6129b4724ddd17fd199f6Chris Lattner            mii->getOperand(i).setReg(reg);
1711a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
1722638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng            // If the definition instruction is re-materializable, its spill
1732638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng            // weight is zero.
1741a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos            LiveInterval &RegInt = getInterval(reg);
1752638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng            if (!RegInt.remat) {
1762638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng              RegInt.weight +=
1772638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng                (mop.isUse() + mop.isDef()) * pow(10.0F, (int)loopDepth);
1782638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng            }
1791a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos          }
1801a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        }
1811a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        ++mii;
1821a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      }
1831a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    }
1841a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  }
1857a40eaaceec0af76d5b97610f3d4e7a47a19d245Alkis Evlogimenos
186993141402f57b4d4cbb7f8a3113f19c61688f9b7Evan Cheng  for (iterator I = begin(), E = end(); I != E; ++I) {
187b75a663707e40a6b72bf404e7fbf08f7d9e1eb90Chris Lattner    LiveInterval &LI = I->second;
188b75a663707e40a6b72bf404e7fbf08f7d9e1eb90Chris Lattner    if (MRegisterInfo::isVirtualRegister(LI.reg)) {
189c9d94d12900bd0d2bd482ef31f8f1deb3ffafa23Chris Lattner      // If the live interval length is essentially zero, i.e. in every live
190993141402f57b4d4cbb7f8a3113f19c61688f9b7Evan Cheng      // range the use follows def immediately, it doesn't make sense to spill
191993141402f57b4d4cbb7f8a3113f19c61688f9b7Evan Cheng      // it and hope it will be easier to allocate for this li.
192b75a663707e40a6b72bf404e7fbf08f7d9e1eb90Chris Lattner      if (isZeroLengthInterval(&LI))
1937902c75331fa8f38fc8380f5573d935c0d149ef5Jim Laskey        LI.weight = HUGE_VALF;
194b75a663707e40a6b72bf404e7fbf08f7d9e1eb90Chris Lattner
195393ebae0ef7fa72d133bf901a02fcce3b5554ab7Chris Lattner      // Divide the weight of the interval by its size.  This encourages
196393ebae0ef7fa72d133bf901a02fcce3b5554ab7Chris Lattner      // spilling of intervals that are large and have few uses, and
197393ebae0ef7fa72d133bf901a02fcce3b5554ab7Chris Lattner      // discourages spilling of small intervals with many uses.
198393ebae0ef7fa72d133bf901a02fcce3b5554ab7Chris Lattner      unsigned Size = 0;
199393ebae0ef7fa72d133bf901a02fcce3b5554ab7Chris Lattner      for (LiveInterval::iterator II = LI.begin(), E = LI.end(); II != E;++II)
200393ebae0ef7fa72d133bf901a02fcce3b5554ab7Chris Lattner        Size += II->end - II->start;
201b75a663707e40a6b72bf404e7fbf08f7d9e1eb90Chris Lattner
202393ebae0ef7fa72d133bf901a02fcce3b5554ab7Chris Lattner      LI.weight /= Size;
203c9d94d12900bd0d2bd482ef31f8f1deb3ffafa23Chris Lattner    }
204993141402f57b4d4cbb7f8a3113f19c61688f9b7Evan Cheng  }
205993141402f57b4d4cbb7f8a3113f19c61688f9b7Evan Cheng
20670ca358b7d540b6061236ddf757085042873c12cChris Lattner  DEBUG(dump());
2071a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  return true;
208ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos}
209ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
21070ca358b7d540b6061236ddf757085042873c12cChris Lattner/// print - Implement the dump method.
211ce9653ce449f1409815547e1bf60abcd1332d2c9Reid Spencervoid LiveIntervals::print(std::ostream &O, const Module* ) const {
21270ca358b7d540b6061236ddf757085042873c12cChris Lattner  O << "********** INTERVALS **********\n";
2138e7a70976deee78a84099b916591d40f7a1cdc34Chris Lattner  for (const_iterator I = begin(), E = end(); I != E; ++I) {
214bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    I->second.print(DOUT, mri_);
215bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    DOUT << "\n";
2168e7a70976deee78a84099b916591d40f7a1cdc34Chris Lattner  }
21770ca358b7d540b6061236ddf757085042873c12cChris Lattner
21870ca358b7d540b6061236ddf757085042873c12cChris Lattner  O << "********** MACHINEINSTRS **********\n";
21970ca358b7d540b6061236ddf757085042873c12cChris Lattner  for (MachineFunction::iterator mbbi = mf_->begin(), mbbe = mf_->end();
22070ca358b7d540b6061236ddf757085042873c12cChris Lattner       mbbi != mbbe; ++mbbi) {
22170ca358b7d540b6061236ddf757085042873c12cChris Lattner    O << ((Value*)mbbi->getBasicBlock())->getName() << ":\n";
22270ca358b7d540b6061236ddf757085042873c12cChris Lattner    for (MachineBasicBlock::iterator mii = mbbi->begin(),
22370ca358b7d540b6061236ddf757085042873c12cChris Lattner           mie = mbbi->end(); mii != mie; ++mii) {
224477e4555de341c5de780de3720d6f115ec133c4eChris Lattner      O << getInstructionIndex(mii) << '\t' << *mii;
22570ca358b7d540b6061236ddf757085042873c12cChris Lattner    }
22670ca358b7d540b6061236ddf757085042873c12cChris Lattner  }
22770ca358b7d540b6061236ddf757085042873c12cChris Lattner}
22870ca358b7d540b6061236ddf757085042873c12cChris Lattner
22901352aa1875ee08ae847cce398322042830d92edBill Wendling/// CreateNewLiveInterval - Create a new live interval with the given live
23001352aa1875ee08ae847cce398322042830d92edBill Wendling/// ranges. The new live interval will have an infinite spill weight.
23101352aa1875ee08ae847cce398322042830d92edBill WendlingLiveInterval&
23201352aa1875ee08ae847cce398322042830d92edBill WendlingLiveIntervals::CreateNewLiveInterval(const LiveInterval *LI,
23301352aa1875ee08ae847cce398322042830d92edBill Wendling                                     const std::vector<LiveRange> &LRs) {
23401352aa1875ee08ae847cce398322042830d92edBill Wendling  const TargetRegisterClass *RC = mf_->getSSARegMap()->getRegClass(LI->reg);
23501352aa1875ee08ae847cce398322042830d92edBill Wendling
23601352aa1875ee08ae847cce398322042830d92edBill Wendling  // Create a new virtual register for the spill interval.
23701352aa1875ee08ae847cce398322042830d92edBill Wendling  unsigned NewVReg = mf_->getSSARegMap()->createVirtualRegister(RC);
23801352aa1875ee08ae847cce398322042830d92edBill Wendling
23901352aa1875ee08ae847cce398322042830d92edBill Wendling  // Replace the old virtual registers in the machine operands with the shiny
24001352aa1875ee08ae847cce398322042830d92edBill Wendling  // new one.
24101352aa1875ee08ae847cce398322042830d92edBill Wendling  for (std::vector<LiveRange>::const_iterator
24201352aa1875ee08ae847cce398322042830d92edBill Wendling         I = LRs.begin(), E = LRs.end(); I != E; ++I) {
24301352aa1875ee08ae847cce398322042830d92edBill Wendling    unsigned Index = getBaseIndex(I->start);
24401352aa1875ee08ae847cce398322042830d92edBill Wendling    unsigned End = getBaseIndex(I->end - 1) + InstrSlots::NUM;
24501352aa1875ee08ae847cce398322042830d92edBill Wendling
24601352aa1875ee08ae847cce398322042830d92edBill Wendling    for (; Index != End; Index += InstrSlots::NUM) {
24701352aa1875ee08ae847cce398322042830d92edBill Wendling      // Skip deleted instructions
24801352aa1875ee08ae847cce398322042830d92edBill Wendling      while (Index != End && !getInstructionFromIndex(Index))
24901352aa1875ee08ae847cce398322042830d92edBill Wendling        Index += InstrSlots::NUM;
25001352aa1875ee08ae847cce398322042830d92edBill Wendling
25101352aa1875ee08ae847cce398322042830d92edBill Wendling      if (Index == End) break;
25201352aa1875ee08ae847cce398322042830d92edBill Wendling
25301352aa1875ee08ae847cce398322042830d92edBill Wendling      MachineInstr *MI = getInstructionFromIndex(Index);
25401352aa1875ee08ae847cce398322042830d92edBill Wendling
255beeb77f3ae9e784f45ede2e38f51b9b25eb65913Bill Wendling      for (unsigned J = 0, e = MI->getNumOperands(); J != e; ++J) {
25601352aa1875ee08ae847cce398322042830d92edBill Wendling        MachineOperand &MOp = MI->getOperand(J);
25701352aa1875ee08ae847cce398322042830d92edBill Wendling        if (MOp.isRegister() && rep(MOp.getReg()) == LI->reg)
25801352aa1875ee08ae847cce398322042830d92edBill Wendling          MOp.setReg(NewVReg);
25901352aa1875ee08ae847cce398322042830d92edBill Wendling      }
26001352aa1875ee08ae847cce398322042830d92edBill Wendling    }
26101352aa1875ee08ae847cce398322042830d92edBill Wendling  }
26201352aa1875ee08ae847cce398322042830d92edBill Wendling
26301352aa1875ee08ae847cce398322042830d92edBill Wendling  LiveInterval &NewLI = getOrCreateInterval(NewVReg);
26401352aa1875ee08ae847cce398322042830d92edBill Wendling
26501352aa1875ee08ae847cce398322042830d92edBill Wendling  // The spill weight is now infinity as it cannot be spilled again
26601352aa1875ee08ae847cce398322042830d92edBill Wendling  NewLI.weight = float(HUGE_VAL);
26701352aa1875ee08ae847cce398322042830d92edBill Wendling
26801352aa1875ee08ae847cce398322042830d92edBill Wendling  for (std::vector<LiveRange>::const_iterator
26901352aa1875ee08ae847cce398322042830d92edBill Wendling         I = LRs.begin(), E = LRs.end(); I != E; ++I) {
270bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    DOUT << "  Adding live range " << *I << " to new interval\n";
27101352aa1875ee08ae847cce398322042830d92edBill Wendling    NewLI.addRange(*I);
27201352aa1875ee08ae847cce398322042830d92edBill Wendling  }
27301352aa1875ee08ae847cce398322042830d92edBill Wendling
274bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << "Created new live interval " << NewLI << "\n";
27501352aa1875ee08ae847cce398322042830d92edBill Wendling  return NewLI;
27601352aa1875ee08ae847cce398322042830d92edBill Wendling}
27701352aa1875ee08ae847cce398322042830d92edBill Wendling
27870ca358b7d540b6061236ddf757085042873c12cChris Lattnerstd::vector<LiveInterval*> LiveIntervals::
27970ca358b7d540b6061236ddf757085042873c12cChris LattneraddIntervalsForSpills(const LiveInterval &li, VirtRegMap &vrm, int slot) {
280d8d26b3268acf7f157028f0cb60a545b185e8905Alkis Evlogimenos  // since this is called after the analysis is done we don't know if
281d8d26b3268acf7f157028f0cb60a545b185e8905Alkis Evlogimenos  // LiveVariables is available
282d8d26b3268acf7f157028f0cb60a545b185e8905Alkis Evlogimenos  lv_ = getAnalysisToUpdate<LiveVariables>();
283d8d26b3268acf7f157028f0cb60a545b185e8905Alkis Evlogimenos
2841a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  std::vector<LiveInterval*> added;
2851a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
2867902c75331fa8f38fc8380f5573d935c0d149ef5Jim Laskey  assert(li.weight != HUGE_VALF &&
2871a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos         "attempt to spill already spilled interval!");
2881a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
289bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << "\t\t\t\tadding intervals for spills for interval: ";
290bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  li.print(DOUT, mri_);
291bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << '\n';
2921a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
2931a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(li.reg);
2941a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
2951a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  for (LiveInterval::Ranges::const_iterator
2961a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos         i = li.ranges.begin(), e = li.ranges.end(); i != e; ++i) {
2971a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    unsigned index = getBaseIndex(i->start);
2981a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    unsigned end = getBaseIndex(i->end-1) + InstrSlots::NUM;
2991a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    for (; index != end; index += InstrSlots::NUM) {
3001a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // skip deleted instructions
3011a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      while (index != end && !getInstructionFromIndex(index))
3021a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        index += InstrSlots::NUM;
3031a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      if (index == end) break;
3041a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
3053b9db830f7f0ed33af13459be3fd60ebe01a13caChris Lattner      MachineInstr *MI = getInstructionFromIndex(index);
3061a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
3072926869b4a083fc951484de03a9867eabf81e880Chris Lattner    RestartInstruction:
3083b9db830f7f0ed33af13459be3fd60ebe01a13caChris Lattner      for (unsigned i = 0; i != MI->getNumOperands(); ++i) {
3093b9db830f7f0ed33af13459be3fd60ebe01a13caChris Lattner        MachineOperand& mop = MI->getOperand(i);
3101a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        if (mop.isRegister() && mop.getReg() == li.reg) {
3112638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng          MachineInstr *fmi = li.remat ? NULL
3122638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng            : mri_->foldMemoryOperand(MI, i, slot);
3132638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng          if (fmi) {
314b11443dc8458b0ba72d484dacf99dffa2e8d3b51Chris Lattner            // Attempt to fold the memory reference into the instruction.  If we
315b11443dc8458b0ba72d484dacf99dffa2e8d3b51Chris Lattner            // can do this, we don't need to insert spill code.
316d8d26b3268acf7f157028f0cb60a545b185e8905Alkis Evlogimenos            if (lv_)
3173b9db830f7f0ed33af13459be3fd60ebe01a13caChris Lattner              lv_->instructionChanged(MI, fmi);
318200370fb5617a1719f0054804b412469ce486ebdEvan Cheng            MachineBasicBlock &MBB = *MI->getParent();
31935f2705e3de4600c3621b883eed9b22e4607ddf4Chris Lattner            vrm.virtFolded(li.reg, MI, i, fmi);
3203b9db830f7f0ed33af13459be3fd60ebe01a13caChris Lattner            mi2iMap_.erase(MI);
3211a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos            i2miMap_[index/InstrSlots::NUM] = fmi;
3221a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos            mi2iMap_[fmi] = index;
3233b9db830f7f0ed33af13459be3fd60ebe01a13caChris Lattner            MI = MBB.insert(MBB.erase(MI), fmi);
3241a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos            ++numFolded;
325477e4555de341c5de780de3720d6f115ec133c4eChris Lattner            // Folding the load/store can completely change the instruction in
326477e4555de341c5de780de3720d6f115ec133c4eChris Lattner            // unpredictable ways, rescan it from the beginning.
3272926869b4a083fc951484de03a9867eabf81e880Chris Lattner            goto RestartInstruction;
328477e4555de341c5de780de3720d6f115ec133c4eChris Lattner          } else {
3292926869b4a083fc951484de03a9867eabf81e880Chris Lattner            // Create a new virtual register for the spill interval.
3302926869b4a083fc951484de03a9867eabf81e880Chris Lattner            unsigned NewVReg = mf_->getSSARegMap()->createVirtualRegister(rc);
3312926869b4a083fc951484de03a9867eabf81e880Chris Lattner
3322926869b4a083fc951484de03a9867eabf81e880Chris Lattner            // Scan all of the operands of this instruction rewriting operands
3332926869b4a083fc951484de03a9867eabf81e880Chris Lattner            // to use NewVReg instead of li.reg as appropriate.  We do this for
3342926869b4a083fc951484de03a9867eabf81e880Chris Lattner            // two reasons:
3351a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos            //
3362926869b4a083fc951484de03a9867eabf81e880Chris Lattner            //   1. If the instr reads the same spilled vreg multiple times, we
3372926869b4a083fc951484de03a9867eabf81e880Chris Lattner            //      want to reuse the NewVReg.
3382926869b4a083fc951484de03a9867eabf81e880Chris Lattner            //   2. If the instr is a two-addr instruction, we are required to
3392926869b4a083fc951484de03a9867eabf81e880Chris Lattner            //      keep the src/dst regs pinned.
3402926869b4a083fc951484de03a9867eabf81e880Chris Lattner            //
3412926869b4a083fc951484de03a9867eabf81e880Chris Lattner            // Keep track of whether we replace a use and/or def so that we can
3422926869b4a083fc951484de03a9867eabf81e880Chris Lattner            // create the spill interval with the appropriate range.
3432926869b4a083fc951484de03a9867eabf81e880Chris Lattner            mop.setReg(NewVReg);
3442926869b4a083fc951484de03a9867eabf81e880Chris Lattner
3452926869b4a083fc951484de03a9867eabf81e880Chris Lattner            bool HasUse = mop.isUse();
3462926869b4a083fc951484de03a9867eabf81e880Chris Lattner            bool HasDef = mop.isDef();
3472926869b4a083fc951484de03a9867eabf81e880Chris Lattner            for (unsigned j = i+1, e = MI->getNumOperands(); j != e; ++j) {
3482926869b4a083fc951484de03a9867eabf81e880Chris Lattner              if (MI->getOperand(j).isReg() &&
3492926869b4a083fc951484de03a9867eabf81e880Chris Lattner                  MI->getOperand(j).getReg() == li.reg) {
3502926869b4a083fc951484de03a9867eabf81e880Chris Lattner                MI->getOperand(j).setReg(NewVReg);
3512926869b4a083fc951484de03a9867eabf81e880Chris Lattner                HasUse |= MI->getOperand(j).isUse();
3522926869b4a083fc951484de03a9867eabf81e880Chris Lattner                HasDef |= MI->getOperand(j).isDef();
3532926869b4a083fc951484de03a9867eabf81e880Chris Lattner              }
3542926869b4a083fc951484de03a9867eabf81e880Chris Lattner            }
3551a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
3561a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos            // create a new register for this spill
3571a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos            vrm.grow();
3582638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng            if (li.remat)
3592638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng              vrm.setVirtIsReMaterialized(NewVReg, li.remat);
3602926869b4a083fc951484de03a9867eabf81e880Chris Lattner            vrm.assignVirt2StackSlot(NewVReg, slot);
3612926869b4a083fc951484de03a9867eabf81e880Chris Lattner            LiveInterval &nI = getOrCreateInterval(NewVReg);
3622638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng            nI.remat = li.remat;
3631a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos            assert(nI.empty());
36470ca358b7d540b6061236ddf757085042873c12cChris Lattner
3651a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos            // the spill weight is now infinity as it
3661a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos            // cannot be spilled again
3677902c75331fa8f38fc8380f5573d935c0d149ef5Jim Laskey            nI.weight = HUGE_VALF;
3682926869b4a083fc951484de03a9867eabf81e880Chris Lattner
3692926869b4a083fc951484de03a9867eabf81e880Chris Lattner            if (HasUse) {
3702926869b4a083fc951484de03a9867eabf81e880Chris Lattner              LiveRange LR(getLoadIndex(index), getUseIndex(index),
3712926869b4a083fc951484de03a9867eabf81e880Chris Lattner                           nI.getNextValue(~0U, 0));
372bdc679d564e67a81792e463f6614b0088f975025Bill Wendling              DOUT << " +" << LR;
3732926869b4a083fc951484de03a9867eabf81e880Chris Lattner              nI.addRange(LR);
3742926869b4a083fc951484de03a9867eabf81e880Chris Lattner            }
3752926869b4a083fc951484de03a9867eabf81e880Chris Lattner            if (HasDef) {
3762926869b4a083fc951484de03a9867eabf81e880Chris Lattner              LiveRange LR(getDefIndex(index), getStoreIndex(index),
3772926869b4a083fc951484de03a9867eabf81e880Chris Lattner                           nI.getNextValue(~0U, 0));
378bdc679d564e67a81792e463f6614b0088f975025Bill Wendling              DOUT << " +" << LR;
3792926869b4a083fc951484de03a9867eabf81e880Chris Lattner              nI.addRange(LR);
3802926869b4a083fc951484de03a9867eabf81e880Chris Lattner            }
3812926869b4a083fc951484de03a9867eabf81e880Chris Lattner
3821a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos            added.push_back(&nI);
38370ca358b7d540b6061236ddf757085042873c12cChris Lattner
384d8d26b3268acf7f157028f0cb60a545b185e8905Alkis Evlogimenos            // update live variables if it is available
385d8d26b3268acf7f157028f0cb60a545b185e8905Alkis Evlogimenos            if (lv_)
3862926869b4a083fc951484de03a9867eabf81e880Chris Lattner              lv_->addVirtualRegisterKilled(NewVReg, MI);
387b11443dc8458b0ba72d484dacf99dffa2e8d3b51Chris Lattner
388bdc679d564e67a81792e463f6614b0088f975025Bill Wendling            DOUT << "\t\t\t\tadded new interval: ";
389bdc679d564e67a81792e463f6614b0088f975025Bill Wendling            nI.print(DOUT, mri_);
390bdc679d564e67a81792e463f6614b0088f975025Bill Wendling            DOUT << '\n';
3911a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos          }
392843b160a2040b3ec4d3452678450afa11704c473Alkis Evlogimenos        }
3931a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      }
394843b160a2040b3ec4d3452678450afa11704c473Alkis Evlogimenos    }
3951a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  }
39626f5a69e52b64e035d26c135979a39b39fd6ba3eAlkis Evlogimenos
3971a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  return added;
398843b160a2040b3ec4d3452678450afa11704c473Alkis Evlogimenos}
399843b160a2040b3ec4d3452678450afa11704c473Alkis Evlogimenos
400be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattnervoid LiveIntervals::printRegName(unsigned reg) const {
4011a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  if (MRegisterInfo::isPhysicalRegister(reg))
402e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling    cerr << mri_->getName(reg);
4031a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  else
404e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling    cerr << "%reg" << reg;
405ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos}
406ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
407bf105c842450d3308d024be203ddd533f37051ecEvan Cheng/// isReDefinedByTwoAddr - Returns true if the Reg re-definition is due to
408bf105c842450d3308d024be203ddd533f37051ecEvan Cheng/// two addr elimination.
409bf105c842450d3308d024be203ddd533f37051ecEvan Chengstatic bool isReDefinedByTwoAddr(MachineInstr *MI, unsigned Reg,
410bf105c842450d3308d024be203ddd533f37051ecEvan Cheng                                const TargetInstrInfo *TII) {
411bf105c842450d3308d024be203ddd533f37051ecEvan Cheng  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
412bf105c842450d3308d024be203ddd533f37051ecEvan Cheng    MachineOperand &MO1 = MI->getOperand(i);
413bf105c842450d3308d024be203ddd533f37051ecEvan Cheng    if (MO1.isRegister() && MO1.isDef() && MO1.getReg() == Reg) {
414bf105c842450d3308d024be203ddd533f37051ecEvan Cheng      for (unsigned j = i+1; j < e; ++j) {
415bf105c842450d3308d024be203ddd533f37051ecEvan Cheng        MachineOperand &MO2 = MI->getOperand(j);
416bf105c842450d3308d024be203ddd533f37051ecEvan Cheng        if (MO2.isRegister() && MO2.isUse() && MO2.getReg() == Reg &&
41751cdcd197268a7abf19b2698fc824e0da3d98049Evan Cheng            MI->getInstrDescriptor()->
41851cdcd197268a7abf19b2698fc824e0da3d98049Evan Cheng            getOperandConstraint(j, TOI::TIED_TO) == (int)i)
419bf105c842450d3308d024be203ddd533f37051ecEvan Cheng          return true;
420bf105c842450d3308d024be203ddd533f37051ecEvan Cheng      }
421bf105c842450d3308d024be203ddd533f37051ecEvan Cheng    }
422bf105c842450d3308d024be203ddd533f37051ecEvan Cheng  }
423bf105c842450d3308d024be203ddd533f37051ecEvan Cheng  return false;
424bf105c842450d3308d024be203ddd533f37051ecEvan Cheng}
425bf105c842450d3308d024be203ddd533f37051ecEvan Cheng
426be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattnervoid LiveIntervals::handleVirtualRegisterDef(MachineBasicBlock *mbb,
427ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos                                             MachineBasicBlock::iterator mi,
4286b128bdc58a496e9f08e4d09416330320761baffChris Lattner                                             unsigned MIIdx,
429be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner                                             LiveInterval &interval) {
430bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << "\t\tregister: "; DEBUG(printRegName(interval.reg));
4311a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  LiveVariables::VarInfo& vi = lv_->getVarInfo(interval.reg);
4321a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
433706515727c6d024015fffded2b3109a4f0ac5299Alkis Evlogimenos  // Virtual registers may be defined multiple times (due to phi
434706515727c6d024015fffded2b3109a4f0ac5299Alkis Evlogimenos  // elimination and 2-addr elimination).  Much of what we do only has to be
435706515727c6d024015fffded2b3109a4f0ac5299Alkis Evlogimenos  // done once for the vreg.  We use an empty interval to detect the first
4361a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // time we see a vreg.
4371a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  if (interval.empty()) {
4382638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng    // Remember if the definition can be rematerialized.
4392638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng    if (EnableReMat &&
4402638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng        vi.DefInst && tii_->isReMaterializable(vi.DefInst->getOpcode()))
4412638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng      interval.remat = vi.DefInst;
4422638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng
4431a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // Get the Idx of the defining instructions.
4446b128bdc58a496e9f08e4d09416330320761baffChris Lattner    unsigned defIndex = getDefIndex(MIIdx);
4451a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
44691725b75852443923b419fd23215194cfc65dd88Chris Lattner    unsigned ValNum;
44791725b75852443923b419fd23215194cfc65dd88Chris Lattner    unsigned SrcReg, DstReg;
44891725b75852443923b419fd23215194cfc65dd88Chris Lattner    if (!tii_->isMoveInstr(*mi, SrcReg, DstReg))
44991725b75852443923b419fd23215194cfc65dd88Chris Lattner      ValNum = interval.getNextValue(~0U, 0);
45091725b75852443923b419fd23215194cfc65dd88Chris Lattner    else
45191725b75852443923b419fd23215194cfc65dd88Chris Lattner      ValNum = interval.getNextValue(defIndex, SrcReg);
45291725b75852443923b419fd23215194cfc65dd88Chris Lattner
4531a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    assert(ValNum == 0 && "First value in interval is not 0?");
4541a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    ValNum = 0;  // Clue in the optimizer.
4551a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
4561a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // Loop over all of the blocks that the vreg is defined in.  There are
4571a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // two cases we have to handle here.  The most common case is a vreg
4581a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // whose lifetime is contained within a basic block.  In this case there
4591a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // will be a single kill, in MBB, which comes after the definition.
4601a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    if (vi.Kills.size() == 1 && vi.Kills[0]->getParent() == mbb) {
4611a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // FIXME: what about dead vars?
4621a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      unsigned killIdx;
4631a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      if (vi.Kills[0] != mi)
4641a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        killIdx = getUseIndex(getInstructionIndex(vi.Kills[0]))+1;
4651a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      else
4661a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        killIdx = defIndex+1;
4671a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
4681a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // If the kill happens after the definition, we have an intra-block
4691a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // live range.
4701a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      if (killIdx > defIndex) {
47161de82d8853a02fe39c47302432abb70a586704fEvan Cheng        assert(vi.AliveBlocks.none() &&
4721a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos               "Shouldn't be alive across any blocks!");
4731a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        LiveRange LR(defIndex, killIdx, ValNum);
4741a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        interval.addRange(LR);
475bdc679d564e67a81792e463f6614b0088f975025Bill Wendling        DOUT << " +" << LR << "\n";
4761a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        return;
4771a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      }
4781a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    }
4796097d13b2a624048dbe02e39e2dfb23bfa269b64Chris Lattner
4801a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // The other case we handle is when a virtual register lives to the end
4811a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // of the defining block, potentially live across some blocks, then is
4821a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // live into some number of blocks, but gets killed.  Start by adding a
4831a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // range that goes from this definition to the end of the defining block.
484d19e2901c1b79d287d01079659684f3a4951a69eAlkis Evlogimenos    LiveRange NewLR(defIndex,
485d19e2901c1b79d287d01079659684f3a4951a69eAlkis Evlogimenos                    getInstructionIndex(&mbb->back()) + InstrSlots::NUM,
486d19e2901c1b79d287d01079659684f3a4951a69eAlkis Evlogimenos                    ValNum);
487bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    DOUT << " +" << NewLR;
4881a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    interval.addRange(NewLR);
4891a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
4901a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // Iterate over all of the blocks that the variable is completely
4911a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // live in, adding [insrtIndex(begin), instrIndex(end)+4) to the
4921a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // live interval.
4931a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    for (unsigned i = 0, e = vi.AliveBlocks.size(); i != e; ++i) {
4941a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      if (vi.AliveBlocks[i]) {
495428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner        MachineBasicBlock *MBB = mf_->getBlockNumbered(i);
496428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner        if (!MBB->empty()) {
497428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner          LiveRange LR(getMBBStartIdx(i),
498428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner                       getInstructionIndex(&MBB->back()) + InstrSlots::NUM,
4991a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos                       ValNum);
5001a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos          interval.addRange(LR);
501bdc679d564e67a81792e463f6614b0088f975025Bill Wendling          DOUT << " +" << LR;
5021a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        }
5031a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      }
5041a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    }
5051a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
5061a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // Finally, this virtual register is live from the start of any killing
5071a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // block to the 'use' slot of the killing instruction.
5081a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    for (unsigned i = 0, e = vi.Kills.size(); i != e; ++i) {
5091a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      MachineInstr *Kill = vi.Kills[i];
510428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner      LiveRange LR(getMBBStartIdx(Kill->getParent()),
511d19e2901c1b79d287d01079659684f3a4951a69eAlkis Evlogimenos                   getUseIndex(getInstructionIndex(Kill))+1,
512d19e2901c1b79d287d01079659684f3a4951a69eAlkis Evlogimenos                   ValNum);
5131a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      interval.addRange(LR);
514bdc679d564e67a81792e463f6614b0088f975025Bill Wendling      DOUT << " +" << LR;
5151a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    }
5161a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
5171a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  } else {
5182638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng    // Can't safely assume definition is rematierializable anymore.
5192638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng    interval.remat = NULL;
5202638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng
5211a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // If this is the second time we see a virtual register definition, it
5221a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // must be due to phi elimination or two addr elimination.  If this is
523bf105c842450d3308d024be203ddd533f37051ecEvan Cheng    // the result of two address elimination, then the vreg is one of the
524bf105c842450d3308d024be203ddd533f37051ecEvan Cheng    // def-and-use register operand.
525bf105c842450d3308d024be203ddd533f37051ecEvan Cheng    if (isReDefinedByTwoAddr(mi, interval.reg, tii_)) {
5261a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // If this is a two-address definition, then we have already processed
5271a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // the live range.  The only problem is that we didn't realize there
5281a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // are actually two values in the live interval.  Because of this we
5291a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // need to take the LiveRegion that defines this register and split it
5301a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // into two values.
5311a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      unsigned DefIndex = getDefIndex(getInstructionIndex(vi.DefInst));
5326b128bdc58a496e9f08e4d09416330320761baffChris Lattner      unsigned RedefIndex = getDefIndex(MIIdx);
5331a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
5341a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // Delete the initial value, which should be short and continuous,
535be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner      // because the 2-addr copy must be in the same MBB as the redef.
5361a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      interval.removeRange(DefIndex, RedefIndex);
537706515727c6d024015fffded2b3109a4f0ac5299Alkis Evlogimenos
538be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner      // Two-address vregs should always only be redefined once.  This means
539be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner      // that at this point, there should be exactly one value number in it.
540be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner      assert(interval.containsOneValue() && "Unexpected 2-addr liveint!");
541be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner
54291725b75852443923b419fd23215194cfc65dd88Chris Lattner      // The new value number (#1) is defined by the instruction we claimed
54391725b75852443923b419fd23215194cfc65dd88Chris Lattner      // defined value #0.
54491725b75852443923b419fd23215194cfc65dd88Chris Lattner      unsigned ValNo = interval.getNextValue(0, 0);
54591725b75852443923b419fd23215194cfc65dd88Chris Lattner      interval.setValueNumberInfo(1, interval.getValNumInfo(0));
546be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner
54791725b75852443923b419fd23215194cfc65dd88Chris Lattner      // Value#0 is now defined by the 2-addr instruction.
54891725b75852443923b419fd23215194cfc65dd88Chris Lattner      interval.setValueNumberInfo(0, std::make_pair(~0U, 0U));
549be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner
550be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner      // Add the new live interval which replaces the range for the input copy.
551be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner      LiveRange LR(DefIndex, RedefIndex, ValNo);
552bdc679d564e67a81792e463f6614b0088f975025Bill Wendling      DOUT << " replace range with " << LR;
5531a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      interval.addRange(LR);
5541a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
5551a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // If this redefinition is dead, we need to add a dummy unit live
5561a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // range covering the def slot.
557ab4b66d4c279e8cd9e448687020fc838e7881dbcChris Lattner      if (lv_->RegisterDefIsDead(mi, interval.reg))
558ab4b66d4c279e8cd9e448687020fc838e7881dbcChris Lattner        interval.addRange(LiveRange(RedefIndex, RedefIndex+1, 0));
5591a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
56056fdd7af884a35673fb6dd3e01333960922c3ac2Evan Cheng      DOUT << " RESULT: ";
561bdc679d564e67a81792e463f6614b0088f975025Bill Wendling      interval.print(DOUT, mri_);
5621a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
5631a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    } else {
5641a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // Otherwise, this must be because of phi elimination.  If this is the
5651a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // first redefinition of the vreg that we have seen, go back and change
5661a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // the live range in the PHI block to be a different value number.
5671a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      if (interval.containsOneValue()) {
5681a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        assert(vi.Kills.size() == 1 &&
5691a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos               "PHI elimination vreg should have one kill, the PHI itself!");
5701a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
5711a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        // Remove the old range that we now know has an incorrect number.
5721a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        MachineInstr *Killer = vi.Kills[0];
573428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner        unsigned Start = getMBBStartIdx(Killer->getParent());
5741a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        unsigned End = getUseIndex(getInstructionIndex(Killer))+1;
57556fdd7af884a35673fb6dd3e01333960922c3ac2Evan Cheng        DOUT << " Removing [" << Start << "," << End << "] from: ";
576bdc679d564e67a81792e463f6614b0088f975025Bill Wendling        interval.print(DOUT, mri_); DOUT << "\n";
5771a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        interval.removeRange(Start, End);
57856fdd7af884a35673fb6dd3e01333960922c3ac2Evan Cheng        DOUT << " RESULT: "; interval.print(DOUT, mri_);
5791a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
580be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner        // Replace the interval with one of a NEW value number.  Note that this
581be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner        // value number isn't actually defined by an instruction, weird huh? :)
58291725b75852443923b419fd23215194cfc65dd88Chris Lattner        LiveRange LR(Start, End, interval.getNextValue(~0U, 0));
583bdc679d564e67a81792e463f6614b0088f975025Bill Wendling        DOUT << " replace range with " << LR;
5841a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        interval.addRange(LR);
58556fdd7af884a35673fb6dd3e01333960922c3ac2Evan Cheng        DOUT << " RESULT: "; interval.print(DOUT, mri_);
5861a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      }
5871a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
5881a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // In the case of PHI elimination, each variable definition is only
5891a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // live until the end of the block.  We've already taken care of the
5901a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // rest of the live range.
5916b128bdc58a496e9f08e4d09416330320761baffChris Lattner      unsigned defIndex = getDefIndex(MIIdx);
59291725b75852443923b419fd23215194cfc65dd88Chris Lattner
59391725b75852443923b419fd23215194cfc65dd88Chris Lattner      unsigned ValNum;
59491725b75852443923b419fd23215194cfc65dd88Chris Lattner      unsigned SrcReg, DstReg;
59591725b75852443923b419fd23215194cfc65dd88Chris Lattner      if (!tii_->isMoveInstr(*mi, SrcReg, DstReg))
59691725b75852443923b419fd23215194cfc65dd88Chris Lattner        ValNum = interval.getNextValue(~0U, 0);
59791725b75852443923b419fd23215194cfc65dd88Chris Lattner      else
59891725b75852443923b419fd23215194cfc65dd88Chris Lattner        ValNum = interval.getNextValue(defIndex, SrcReg);
59991725b75852443923b419fd23215194cfc65dd88Chris Lattner
600706515727c6d024015fffded2b3109a4f0ac5299Alkis Evlogimenos      LiveRange LR(defIndex,
60191725b75852443923b419fd23215194cfc65dd88Chris Lattner                   getInstructionIndex(&mbb->back()) + InstrSlots::NUM, ValNum);
6021a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      interval.addRange(LR);
603bdc679d564e67a81792e463f6614b0088f975025Bill Wendling      DOUT << " +" << LR;
604dd2cc65f34f9b7bfda1cd0c42becedfc361d46f8Alkis Evlogimenos    }
6051a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  }
606ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
607bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << '\n';
608ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos}
609ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
610f35fef7060c465dd7b578bf6339a18e8a8911888Chris Lattnervoid LiveIntervals::handlePhysicalRegisterDef(MachineBasicBlock *MBB,
611ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos                                              MachineBasicBlock::iterator mi,
6126b128bdc58a496e9f08e4d09416330320761baffChris Lattner                                              unsigned MIIdx,
61391725b75852443923b419fd23215194cfc65dd88Chris Lattner                                              LiveInterval &interval,
61491725b75852443923b419fd23215194cfc65dd88Chris Lattner                                              unsigned SrcReg) {
6151a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // A physical register cannot be live across basic block, so its
6161a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // lifetime must end somewhere in its defining basic block.
617bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << "\t\tregister: "; DEBUG(printRegName(interval.reg));
6181a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
6196b128bdc58a496e9f08e4d09416330320761baffChris Lattner  unsigned baseIndex = MIIdx;
6201a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  unsigned start = getDefIndex(baseIndex);
6211a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  unsigned end = start;
6221a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
6231a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // If it is not used after definition, it is considered dead at
6241a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // the instruction defining it. Hence its interval is:
6251a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // [defSlot(def), defSlot(def)+1)
626ab4b66d4c279e8cd9e448687020fc838e7881dbcChris Lattner  if (lv_->RegisterDefIsDead(mi, interval.reg)) {
627bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    DOUT << " dead";
628ab4b66d4c279e8cd9e448687020fc838e7881dbcChris Lattner    end = getDefIndex(start) + 1;
629ab4b66d4c279e8cd9e448687020fc838e7881dbcChris Lattner    goto exit;
6301a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  }
631ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
6321a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // If it is not dead on definition, it must be killed by a
6331a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // subsequent instruction. Hence its interval is:
6341a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // [defSlot(def), useSlot(kill)+1)
6355ab6f5fe666d0e3403d9b777324d1a1999118153Chris Lattner  while (++mi != MBB->end()) {
6361a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    baseIndex += InstrSlots::NUM;
637ab4b66d4c279e8cd9e448687020fc838e7881dbcChris Lattner    if (lv_->KillsRegister(mi, interval.reg)) {
638bdc679d564e67a81792e463f6614b0088f975025Bill Wendling      DOUT << " killed";
639ab4b66d4c279e8cd9e448687020fc838e7881dbcChris Lattner      end = getUseIndex(baseIndex) + 1;
640ab4b66d4c279e8cd9e448687020fc838e7881dbcChris Lattner      goto exit;
6419a1956ae6ad2d4892afbc9f1b97d645d220b6d4aEvan Cheng    } else if (lv_->ModifiesRegister(mi, interval.reg)) {
6429a1956ae6ad2d4892afbc9f1b97d645d220b6d4aEvan Cheng      // Another instruction redefines the register before it is ever read.
6439a1956ae6ad2d4892afbc9f1b97d645d220b6d4aEvan Cheng      // Then the register is essentially dead at the instruction that defines
6449a1956ae6ad2d4892afbc9f1b97d645d220b6d4aEvan Cheng      // it. Hence its interval is:
6459a1956ae6ad2d4892afbc9f1b97d645d220b6d4aEvan Cheng      // [defSlot(def), defSlot(def)+1)
646bdc679d564e67a81792e463f6614b0088f975025Bill Wendling      DOUT << " dead";
6479a1956ae6ad2d4892afbc9f1b97d645d220b6d4aEvan Cheng      end = getDefIndex(start) + 1;
6489a1956ae6ad2d4892afbc9f1b97d645d220b6d4aEvan Cheng      goto exit;
649f35fef7060c465dd7b578bf6339a18e8a8911888Chris Lattner    }
6501a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  }
6515ab6f5fe666d0e3403d9b777324d1a1999118153Chris Lattner
6525ab6f5fe666d0e3403d9b777324d1a1999118153Chris Lattner  // The only case we should have a dead physreg here without a killing or
6535ab6f5fe666d0e3403d9b777324d1a1999118153Chris Lattner  // instruction where we know it's dead is if it is live-in to the function
6545ab6f5fe666d0e3403d9b777324d1a1999118153Chris Lattner  // and never used.
65591725b75852443923b419fd23215194cfc65dd88Chris Lattner  assert(!SrcReg && "physreg was not killed in defining block!");
6565ab6f5fe666d0e3403d9b777324d1a1999118153Chris Lattner  end = getDefIndex(start) + 1;  // It's dead.
65702ba13c9897ae2b19f9201e57460d7ee2b753a0bAlkis Evlogimenos
658ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenosexit:
6591a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  assert(start < end && "did not find end of interval?");
660f768bba43f5c036039851d2fcca8212edca18467Chris Lattner
66191725b75852443923b419fd23215194cfc65dd88Chris Lattner  LiveRange LR(start, end, interval.getNextValue(SrcReg != 0 ? start : ~0U,
66291725b75852443923b419fd23215194cfc65dd88Chris Lattner                                                 SrcReg));
6631a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  interval.addRange(LR);
664bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << " +" << LR << '\n';
665ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos}
666ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
667f35fef7060c465dd7b578bf6339a18e8a8911888Chris Lattnervoid LiveIntervals::handleRegisterDef(MachineBasicBlock *MBB,
668f35fef7060c465dd7b578bf6339a18e8a8911888Chris Lattner                                      MachineBasicBlock::iterator MI,
6696b128bdc58a496e9f08e4d09416330320761baffChris Lattner                                      unsigned MIIdx,
670f35fef7060c465dd7b578bf6339a18e8a8911888Chris Lattner                                      unsigned reg) {
671f35fef7060c465dd7b578bf6339a18e8a8911888Chris Lattner  if (MRegisterInfo::isVirtualRegister(reg))
6726b128bdc58a496e9f08e4d09416330320761baffChris Lattner    handleVirtualRegisterDef(MBB, MI, MIIdx, getOrCreateInterval(reg));
6735327801fb87e3eda52a33f82e6211181030ecb93Alkis Evlogimenos  else if (allocatableRegs_[reg]) {
67491725b75852443923b419fd23215194cfc65dd88Chris Lattner    unsigned SrcReg, DstReg;
67591725b75852443923b419fd23215194cfc65dd88Chris Lattner    if (!tii_->isMoveInstr(*MI, SrcReg, DstReg))
67691725b75852443923b419fd23215194cfc65dd88Chris Lattner      SrcReg = 0;
6776b128bdc58a496e9f08e4d09416330320761baffChris Lattner    handlePhysicalRegisterDef(MBB, MI, MIIdx, getOrCreateInterval(reg), SrcReg);
678f35fef7060c465dd7b578bf6339a18e8a8911888Chris Lattner    for (const unsigned* AS = mri_->getAliasSet(reg); *AS; ++AS)
6796b128bdc58a496e9f08e4d09416330320761baffChris Lattner      handlePhysicalRegisterDef(MBB, MI, MIIdx, getOrCreateInterval(*AS), 0);
680f35fef7060c465dd7b578bf6339a18e8a8911888Chris Lattner  }
6814d46e1e521c0df1990ea50f8146d22bd77ea71a6Alkis Evlogimenos}
6824d46e1e521c0df1990ea50f8146d22bd77ea71a6Alkis Evlogimenos
683b371f457b0ea4a652a9f526ba4375c80ae542252Evan Chengvoid LiveIntervals::handleLiveInRegister(MachineBasicBlock *MBB,
6849b25b8ca24d6df2e097741dcc15016772ee4eda7Jim Laskey                                         unsigned MIIdx,
685b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng                                         LiveInterval &interval) {
686b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  DOUT << "\t\tlivein register: "; DEBUG(printRegName(interval.reg));
687b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
688b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  // Look for kills, if it reaches a def before it's killed, then it shouldn't
689b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  // be considered a livein.
690b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  MachineBasicBlock::iterator mi = MBB->begin();
6919b25b8ca24d6df2e097741dcc15016772ee4eda7Jim Laskey  unsigned baseIndex = MIIdx;
6929b25b8ca24d6df2e097741dcc15016772ee4eda7Jim Laskey  unsigned start = baseIndex;
693b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  unsigned end = start;
694b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  while (mi != MBB->end()) {
695b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    if (lv_->KillsRegister(mi, interval.reg)) {
696b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      DOUT << " killed";
697b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      end = getUseIndex(baseIndex) + 1;
698b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      goto exit;
699b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    } else if (lv_->ModifiesRegister(mi, interval.reg)) {
700b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      // Another instruction redefines the register before it is ever read.
701b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      // Then the register is essentially dead at the instruction that defines
702b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      // it. Hence its interval is:
703b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      // [defSlot(def), defSlot(def)+1)
704b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      DOUT << " dead";
705b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      end = getDefIndex(start) + 1;
706b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      goto exit;
707b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    }
708b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
709b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    baseIndex += InstrSlots::NUM;
710b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    ++mi;
711b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  }
712b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
713b371f457b0ea4a652a9f526ba4375c80ae542252Evan Chengexit:
714b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  assert(start < end && "did not find end of interval?");
715b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
716b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  LiveRange LR(start, end, interval.getNextValue(~0U, 0));
717b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  DOUT << " +" << LR << '\n';
7189b25b8ca24d6df2e097741dcc15016772ee4eda7Jim Laskey  interval.addRange(LR);
719b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng}
720b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
721ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos/// computeIntervals - computes the live intervals for virtual
7224d46e1e521c0df1990ea50f8146d22bd77ea71a6Alkis Evlogimenos/// registers. for some ordering of the machine instructions [1,N] a
72308cec00588ec1a8fa85b208555f006d7396ae7a4Alkis Evlogimenos/// live interval is an interval [i, j) where 1 <= i <= j < N for
724ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos/// which a variable is live
725f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattnervoid LiveIntervals::computeIntervals() {
726bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << "********** COMPUTING LIVE INTERVALS **********\n"
727bdc679d564e67a81792e463f6614b0088f975025Bill Wendling       << "********** Function: "
728bdc679d564e67a81792e463f6614b0088f975025Bill Wendling       << ((Value*)mf_->getFunction())->getName() << '\n';
7296b128bdc58a496e9f08e4d09416330320761baffChris Lattner  // Track the index of the current machine instr.
7306b128bdc58a496e9f08e4d09416330320761baffChris Lattner  unsigned MIIndex = 0;
731428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner  for (MachineFunction::iterator MBBI = mf_->begin(), E = mf_->end();
732428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner       MBBI != E; ++MBBI) {
733428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner    MachineBasicBlock *MBB = MBBI;
734bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    DOUT << ((Value*)MBB->getBasicBlock())->getName() << ":\n";
7351a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
736428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner    MachineBasicBlock::iterator MI = MBB->begin(), miEnd = MBB->end();
7370c9f92e1ff64ee56724eae444a0442b02f83d0a8Evan Cheng
7380c9f92e1ff64ee56724eae444a0442b02f83d0a8Evan Cheng    if (MBB->livein_begin() != MBB->livein_end()) {
739b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      // Create intervals for live-ins to this BB first.
740b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      for (MachineBasicBlock::const_livein_iterator LI = MBB->livein_begin(),
7410c9f92e1ff64ee56724eae444a0442b02f83d0a8Evan Cheng             LE = MBB->livein_end(); LI != LE; ++LI) {
7429b25b8ca24d6df2e097741dcc15016772ee4eda7Jim Laskey        handleLiveInRegister(MBB, MIIndex, getOrCreateInterval(*LI));
7430c9f92e1ff64ee56724eae444a0442b02f83d0a8Evan Cheng        for (const unsigned* AS = mri_->getAliasSet(*LI); *AS; ++AS)
7449b25b8ca24d6df2e097741dcc15016772ee4eda7Jim Laskey          handleLiveInRegister(MBB, MIIndex, getOrCreateInterval(*AS));
7450c9f92e1ff64ee56724eae444a0442b02f83d0a8Evan Cheng      }
746dffb2e83ed2546226d09c40aa43524e2392322daChris Lattner    }
747dffb2e83ed2546226d09c40aa43524e2392322daChris Lattner
748428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner    for (; MI != miEnd; ++MI) {
749bdc679d564e67a81792e463f6614b0088f975025Bill Wendling      DOUT << MIIndex << "\t" << *MI;
7501a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
751438f7bc67cf235ccee7e6f7ac7f4ae2186eb8020Evan Cheng      // Handle defs.
752428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner      for (int i = MI->getNumOperands() - 1; i >= 0; --i) {
753428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner        MachineOperand &MO = MI->getOperand(i);
7541a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        // handle register defs - build intervals
755428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner        if (MO.isRegister() && MO.getReg() && MO.isDef())
756428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner          handleRegisterDef(MBB, MI, MIIndex, MO.getReg());
7571a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      }
7586b128bdc58a496e9f08e4d09416330320761baffChris Lattner
7596b128bdc58a496e9f08e4d09416330320761baffChris Lattner      MIIndex += InstrSlots::NUM;
760ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos    }
7611a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  }
762ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos}
763b27ef248f579b354aab434f63c417ab1103e47e2Alkis Evlogimenos
764f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner/// AdjustCopiesBackFrom - We found a non-trivially-coallescable copy with IntA
765f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner/// being the source and IntB being the dest, thus this defines a value number
766f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner/// in IntB.  If the source value number (in IntA) is defined by a copy from B,
767f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner/// see if we can merge these two pieces of B into a single value number,
768f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner/// eliminating a copy.  For example:
769f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner///
770f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner///  A3 = B0
771f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner///    ...
772f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner///  B1 = A3      <- this copy
773f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner///
774f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner/// In this case, B0 can be extended to where the B1 copy lives, allowing the B1
775f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner/// value number to be replaced with B0 (which simplifies the B liveinterval).
776f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner///
777f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner/// This returns true if an interval was modified.
778f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner///
779f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattnerbool LiveIntervals::AdjustCopiesBackFrom(LiveInterval &IntA, LiveInterval &IntB,
7806d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner                                         MachineInstr *CopyMI) {
7816d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  unsigned CopyIdx = getDefIndex(getInstructionIndex(CopyMI));
7826d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner
783f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // BValNo is a value number in B that is defined by a copy from A.  'B3' in
784f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // the example above.
785f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  LiveInterval::iterator BLR = IntB.FindLiveRangeContaining(CopyIdx);
786f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  unsigned BValNo = BLR->ValId;
787f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner
788f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // Get the location that B is defined at.  Two options: either this value has
789f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // an unknown definition point or it is defined at CopyIdx.  If unknown, we
790f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // can't process it.
791f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  unsigned BValNoDefIdx = IntB.getInstForValNum(BValNo);
792f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  if (BValNoDefIdx == ~0U) return false;
793f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  assert(BValNoDefIdx == CopyIdx &&
794f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner         "Copy doesn't define the value?");
795f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner
796f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // AValNo is the value number in A that defines the copy, A0 in the example.
797f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  LiveInterval::iterator AValLR = IntA.FindLiveRangeContaining(CopyIdx-1);
798f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  unsigned AValNo = AValLR->ValId;
799aa51a484e188ecb8d3e4b6ac852c553a4aacc89aChris Lattner
800f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // If AValNo is defined as a copy from IntB, we can potentially process this.
801aa51a484e188ecb8d3e4b6ac852c553a4aacc89aChris Lattner
802f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // Get the instruction that defines this value number.
80391725b75852443923b419fd23215194cfc65dd88Chris Lattner  unsigned SrcReg = IntA.getSrcRegForValNum(AValNo);
80491725b75852443923b419fd23215194cfc65dd88Chris Lattner  if (!SrcReg) return false;  // Not defined by a copy.
805aa51a484e188ecb8d3e4b6ac852c553a4aacc89aChris Lattner
806f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // If the value number is not defined by a copy instruction, ignore it.
807aa51a484e188ecb8d3e4b6ac852c553a4aacc89aChris Lattner
808f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // If the source register comes from an interval other than IntB, we can't
809f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // handle this.
810f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  if (rep(SrcReg) != IntB.reg) return false;
81191725b75852443923b419fd23215194cfc65dd88Chris Lattner
812f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // Get the LiveRange in IntB that this value number starts with.
81391725b75852443923b419fd23215194cfc65dd88Chris Lattner  unsigned AValNoInstIdx = IntA.getInstForValNum(AValNo);
814f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  LiveInterval::iterator ValLR = IntB.FindLiveRangeContaining(AValNoInstIdx-1);
815aa51a484e188ecb8d3e4b6ac852c553a4aacc89aChris Lattner
816f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // Make sure that the end of the live range is inside the same block as
817f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // CopyMI.
818f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  MachineInstr *ValLREndInst = getInstructionFromIndex(ValLR->end-1);
819c114b2cad7293d98686d380273085f5c32966b52Chris Lattner  if (!ValLREndInst ||
820c114b2cad7293d98686d380273085f5c32966b52Chris Lattner      ValLREndInst->getParent() != CopyMI->getParent()) return false;
821f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner
822f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // Okay, we now know that ValLR ends in the same block that the CopyMI
823f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // live-range starts.  If there are no intervening live ranges between them in
824f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // IntB, we can merge them.
825f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  if (ValLR+1 != BLR) return false;
826aa51a484e188ecb8d3e4b6ac852c553a4aacc89aChris Lattner
827bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << "\nExtending: "; IntB.print(DOUT, mri_);
828ba256037ced5606d5cea8a1676b21eaf91d924deChris Lattner
829ba256037ced5606d5cea8a1676b21eaf91d924deChris Lattner  // We are about to delete CopyMI, so need to remove it as the 'instruction
830ba256037ced5606d5cea8a1676b21eaf91d924deChris Lattner  // that defines this value #'.
83191725b75852443923b419fd23215194cfc65dd88Chris Lattner  IntB.setValueNumberInfo(BValNo, std::make_pair(~0U, 0));
832ba256037ced5606d5cea8a1676b21eaf91d924deChris Lattner
833f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // Okay, we can merge them.  We need to insert a new liverange:
834f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // [ValLR.end, BLR.begin) of either value number, then we merge the
835f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // two value numbers.
836c114b2cad7293d98686d380273085f5c32966b52Chris Lattner  unsigned FillerStart = ValLR->end, FillerEnd = BLR->start;
837c114b2cad7293d98686d380273085f5c32966b52Chris Lattner  IntB.addRange(LiveRange(FillerStart, FillerEnd, BValNo));
838c114b2cad7293d98686d380273085f5c32966b52Chris Lattner
839c114b2cad7293d98686d380273085f5c32966b52Chris Lattner  // If the IntB live range is assigned to a physical register, and if that
840c114b2cad7293d98686d380273085f5c32966b52Chris Lattner  // physreg has aliases,
841c114b2cad7293d98686d380273085f5c32966b52Chris Lattner  if (MRegisterInfo::isPhysicalRegister(IntB.reg)) {
842c114b2cad7293d98686d380273085f5c32966b52Chris Lattner    for (const unsigned *AS = mri_->getAliasSet(IntB.reg); *AS; ++AS) {
843c114b2cad7293d98686d380273085f5c32966b52Chris Lattner      LiveInterval &AliasLI = getInterval(*AS);
844c114b2cad7293d98686d380273085f5c32966b52Chris Lattner      AliasLI.addRange(LiveRange(FillerStart, FillerEnd,
84591725b75852443923b419fd23215194cfc65dd88Chris Lattner                                 AliasLI.getNextValue(~0U, 0)));
846c114b2cad7293d98686d380273085f5c32966b52Chris Lattner    }
847c114b2cad7293d98686d380273085f5c32966b52Chris Lattner  }
848f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner
849f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // Okay, merge "B1" into the same value number as "B0".
850f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  if (BValNo != ValLR->ValId)
851f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner    IntB.MergeValueNumberInto(BValNo, ValLR->ValId);
852bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << "   result = "; IntB.print(DOUT, mri_);
853bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << "\n";
85416191f03337645dc1638b7489d71d685e6c07cddEvan Cheng
85516191f03337645dc1638b7489d71d685e6c07cddEvan Cheng  // If the source instruction was killing the source register before the
85616191f03337645dc1638b7489d71d685e6c07cddEvan Cheng  // merge, unset the isKill marker given the live range has been extended.
857ad7ccf34b5de14bd2b9ddc8072d14582a2ce29d9Evan Cheng  int UIdx = ValLREndInst->findRegisterUseOperand(IntB.reg, true);
858ad7ccf34b5de14bd2b9ddc8072d14582a2ce29d9Evan Cheng  if (UIdx != -1)
859ad7ccf34b5de14bd2b9ddc8072d14582a2ce29d9Evan Cheng    ValLREndInst->getOperand(UIdx).unsetIsKill();
860f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner
861f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // Finally, delete the copy instruction.
862f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  RemoveMachineInstrFromMaps(CopyMI);
863f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  CopyMI->eraseFromParent();
864f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  ++numPeep;
865aa51a484e188ecb8d3e4b6ac852c553a4aacc89aChris Lattner  return true;
866aa51a484e188ecb8d3e4b6ac852c553a4aacc89aChris Lattner}
867aa51a484e188ecb8d3e4b6ac852c553a4aacc89aChris Lattner
868f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner/// JoinCopy - Attempt to join intervals corresponding to SrcReg/DstReg,
869f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner/// which are the src/dst of the copy instruction CopyMI.  This returns true
870f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner/// if the copy was successfully coallesced away, or if it is never possible
871f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner/// to coallesce these this copy, due to register constraints.  It returns
872f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner/// false if it is not currently possible to coallesce this interval, but
873f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner/// it may be possible if other things get coallesced.
874f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattnerbool LiveIntervals::JoinCopy(MachineInstr *CopyMI,
875f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner                             unsigned SrcReg, unsigned DstReg) {
876bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << getInstructionIndex(CopyMI) << '\t' << *CopyMI;
877b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
878f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // Get representative registers.
879b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  unsigned repSrcReg = rep(SrcReg);
880b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  unsigned repDstReg = rep(DstReg);
881f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner
882f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // If they are already joined we continue.
883b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  if (repSrcReg == repDstReg) {
884bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    DOUT << "\tCopy already coallesced.\n";
885f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner    return true;  // Not coallescable.
886f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  }
887f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner
888f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // If they are both physical registers, we cannot join them.
889b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  if (MRegisterInfo::isPhysicalRegister(repSrcReg) &&
890b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      MRegisterInfo::isPhysicalRegister(repDstReg)) {
891bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    DOUT << "\tCan not coallesce physregs.\n";
892f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner    return true;  // Not coallescable.
8937ac2d3146a196fa0120c579ecd2ddd69652ad230Chris Lattner  }
894f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner
895f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // We only join virtual registers with allocatable physical registers.
896b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  if (MRegisterInfo::isPhysicalRegister(repSrcReg) &&
897b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      !allocatableRegs_[repSrcReg]) {
898bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    DOUT << "\tSrc reg is unallocatable physreg.\n";
899f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner    return true;  // Not coallescable.
900f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  }
901b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  if (MRegisterInfo::isPhysicalRegister(repDstReg) &&
902b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      !allocatableRegs_[repDstReg]) {
903bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    DOUT << "\tDst reg is unallocatable physreg.\n";
904f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner    return true;  // Not coallescable.
905f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  }
906f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner
907f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  // If they are not of the same register class, we cannot join them.
908b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  if (differingRegisterClasses(repSrcReg, repDstReg)) {
909bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    DOUT << "\tSrc/Dest are different register classes.\n";
910f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner    return true;  // Not coallescable.
911f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  }
912f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner
913b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  LiveInterval &SrcInt = getInterval(repSrcReg);
914b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  LiveInterval &DestInt = getInterval(repDstReg);
915b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  assert(SrcInt.reg == repSrcReg && DestInt.reg == repDstReg &&
916f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner         "Register mapping is horribly broken!");
917f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner
918bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << "\t\tInspecting "; SrcInt.print(DOUT, mri_);
919bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << " and "; DestInt.print(DOUT, mri_);
920bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << ": ";
921b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
922b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  // Check if it is necessary to propagate "isDead" property before intervals
923b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  // are joined.
924b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  MachineOperand *mopd = CopyMI->findRegisterDefOperand(DstReg);
925b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  bool isDead = mopd->isDead();
926edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng  bool isShorten = false;
9272c3535d2a6738d154914a59f272fac45e50b706bEvan Cheng  unsigned SrcStart = 0, RemoveStart = 0;
9282c3535d2a6738d154914a59f272fac45e50b706bEvan Cheng  unsigned SrcEnd = 0, RemoveEnd = 0;
929b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  if (isDead) {
93048ef398ebd2f2b992c81bebd5159de119ce62c80Evan Cheng    unsigned CopyIdx = getInstructionIndex(CopyMI);
93148ef398ebd2f2b992c81bebd5159de119ce62c80Evan Cheng    LiveInterval::iterator SrcLR =
93248ef398ebd2f2b992c81bebd5159de119ce62c80Evan Cheng      SrcInt.FindLiveRangeContaining(getUseIndex(CopyIdx));
9332c3535d2a6738d154914a59f272fac45e50b706bEvan Cheng    RemoveStart = SrcStart = SrcLR->start;
9342c3535d2a6738d154914a59f272fac45e50b706bEvan Cheng    RemoveEnd   = SrcEnd   = SrcLR->end;
93548ef398ebd2f2b992c81bebd5159de119ce62c80Evan Cheng    // The instruction which defines the src is only truly dead if there are
93648ef398ebd2f2b992c81bebd5159de119ce62c80Evan Cheng    // no intermediate uses and there isn't a use beyond the copy.
93748ef398ebd2f2b992c81bebd5159de119ce62c80Evan Cheng    // FIXME: find the last use, mark is kill and shorten the live range.
938edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng    if (SrcEnd > getDefIndex(CopyIdx))
939b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      isDead = false;
940edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng    else {
941edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng      MachineOperand *MOU;
9422c3535d2a6738d154914a59f272fac45e50b706bEvan Cheng      MachineInstr *LastUse= lastRegisterUse(repSrcReg, SrcStart, CopyIdx, MOU);
943edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng      if (LastUse) {
944edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng        // Shorten the liveinterval to the end of last use.
945edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng        MOU->setIsKill();
946edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng        isDead = false;
947edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng        isShorten = true;
9482c3535d2a6738d154914a59f272fac45e50b706bEvan Cheng        RemoveStart = getDefIndex(getInstructionIndex(LastUse));
9492c3535d2a6738d154914a59f272fac45e50b706bEvan Cheng        RemoveEnd   = SrcEnd;
950edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng      }
951edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng    }
952b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  }
953b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
954ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng  // We need to be careful about coalescing a source physical register with a
955ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng  // virtual register. Once the coalescing is done, it cannot be broken and
956ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng  // these are not spillable! If the destination interval uses are far away,
957ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng  // think twice about coalescing them!
958757072d954937514585b5c213f01f851d31826a1Evan Cheng  if (!mopd->isDead() && MRegisterInfo::isPhysicalRegister(repSrcReg)) {
959ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng    // Small function. No need to worry!
960cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng    unsigned Threshold = allocatableRegs_.count() * 2;
961cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng    if (r2iMap_.size() <= Threshold)
962ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng      goto TryJoin;
963ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng
964ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng    LiveVariables::VarInfo& dvi = lv_->getVarInfo(repDstReg);
965ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng    // Is the value used in the current BB or any immediate successroe BB?
966cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng    MachineBasicBlock *CopyBB = CopyMI->getParent();
967cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng    if (dvi.UsedBlocks[CopyBB->getNumber()])
968cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng      goto TryJoin;
969cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng    for (MachineBasicBlock::succ_iterator SI = CopyBB->succ_begin(),
970cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng           SE = CopyBB->succ_end(); SI != SE; ++SI) {
971cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng      MachineBasicBlock *SuccMBB = *SI;
972cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng      if (dvi.UsedBlocks[SuccMBB->getNumber()])
973ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng          goto TryJoin;
974ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng    }
975ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng
976ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng    // Ok, no use in this BB and no use in immediate successor BB's. Be really
977ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng    // careful now!
978ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng    // It's only used in one BB, forget about it!
979cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng    if (dvi.UsedBlocks.count() < 2) {
980ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng      ++numAborts;
981ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng      return false;
982ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng    }
983ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng
984cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng    // Determine whether to allow coalescing based on how far the closest
985cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng    // use is.
986cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng    unsigned CopyIdx = getInstructionIndex(CopyMI);
987cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng    unsigned MinDist = i2miMap_.size() * InstrSlots::NUM;
988ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng    int UseBBNum = dvi.UsedBlocks.find_first();
989ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng    while (UseBBNum != -1) {
990ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng      MachineBasicBlock *UseBB = mf_->getBlockNumbered(UseBBNum);
991cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng      unsigned UseIdx = getMBBStartIdx(UseBB);
992cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng      if (UseIdx > CopyIdx) {
993cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng        MinDist = std::min(MinDist, UseIdx - CopyIdx);
994cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng        if (MinDist <= Threshold)
995cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng          break;
996cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng      }
997ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng      UseBBNum = dvi.UsedBlocks.find_next(UseBBNum);
998ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng    }
999cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng    if (MinDist > Threshold) {
1000cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng      // Don't do it!
1001cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng      ++numAborts;
1002cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng      return false;
1003cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng    }
1004ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng  }
1005ba1a3df608a14ca37ca944f4c942c202e919ea80Evan Cheng
1006ba1a3df608a14ca37ca944f4c942c202e919ea80Evan ChengTryJoin:
10076d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  // Okay, attempt to join these two intervals.  On failure, this returns false.
10086d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  // Otherwise, if one of the intervals being joined is a physreg, this method
10096d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  // always canonicalizes DestInt to be it.  The output "SrcInt" will not have
10106d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  // been modified, so we can use this information below to update aliases.
1011b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  if (JoinIntervals(DestInt, SrcInt)) {
1012b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    if (isDead) {
1013b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      // Result of the copy is dead. Propagate this property.
1014a16d4429e49b5406c0af905953b5eae13b9cf47cEvan Cheng      if (SrcStart == 0) {
1015a16d4429e49b5406c0af905953b5eae13b9cf47cEvan Cheng        assert(MRegisterInfo::isPhysicalRegister(repSrcReg) &&
1016a16d4429e49b5406c0af905953b5eae13b9cf47cEvan Cheng               "Live-in must be a physical register!");
1017a16d4429e49b5406c0af905953b5eae13b9cf47cEvan Cheng        // Live-in to the function but dead. Remove it from entry live-in set.
1018b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng        // JoinIntervals may end up swapping the two intervals.
1019a16d4429e49b5406c0af905953b5eae13b9cf47cEvan Cheng        mf_->begin()->removeLiveIn(repSrcReg);
1020b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      } else {
1021b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng        MachineInstr *SrcMI = getInstructionFromIndex(SrcStart);
1022b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng        if (SrcMI) {
1023b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng          MachineOperand *mops = SrcMI->findRegisterDefOperand(SrcReg);
1024b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng          if (mops)
1025b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng            // FIXME: mops == NULL means SrcMI defines a subregister?
1026b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng            mops->setIsDead();
1027b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng        }
1028b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      }
1029b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    }
1030edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng
10312c3535d2a6738d154914a59f272fac45e50b706bEvan Cheng    if (isShorten || isDead) {
1032edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng      // Shorten the live interval.
1033edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng      LiveInterval &LiveInInt = (repSrcReg == DestInt.reg) ? DestInt : SrcInt;
10342c3535d2a6738d154914a59f272fac45e50b706bEvan Cheng      LiveInInt.removeRange(RemoveStart, RemoveEnd);
1035edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng    }
1036b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  } else {
10376d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner    // Coallescing failed.
10386d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner
10396d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner    // If we can eliminate the copy without merging the live ranges, do so now.
10406d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner    if (AdjustCopiesBackFrom(SrcInt, DestInt, CopyMI))
10416d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner      return true;
1042f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner
10436d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner    // Otherwise, we are unable to join the intervals.
1044bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    DOUT << "Interference!\n";
1045f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner    return false;
1046f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  }
1047f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner
1048b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  bool Swapped = repSrcReg == DestInt.reg;
1049e7f729b42b54fa751ba3524e1c597aad6d3ec3d7Chris Lattner  if (Swapped)
1050b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    std::swap(repSrcReg, repDstReg);
1051b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  assert(MRegisterInfo::isVirtualRegister(repSrcReg) &&
1052e7f729b42b54fa751ba3524e1c597aad6d3ec3d7Chris Lattner         "LiveInterval::join didn't work right!");
1053e7f729b42b54fa751ba3524e1c597aad6d3ec3d7Chris Lattner
1054c114b2cad7293d98686d380273085f5c32966b52Chris Lattner  // If we're about to merge live ranges into a physical register live range,
1055c114b2cad7293d98686d380273085f5c32966b52Chris Lattner  // we have to update any aliased register's live ranges to indicate that they
1056c114b2cad7293d98686d380273085f5c32966b52Chris Lattner  // have clobbered values for this range.
1057b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  if (MRegisterInfo::isPhysicalRegister(repDstReg)) {
1058b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    for (const unsigned *AS = mri_->getAliasSet(repDstReg); *AS; ++AS)
1059e7f729b42b54fa751ba3524e1c597aad6d3ec3d7Chris Lattner      getInterval(*AS).MergeInClobberRanges(SrcInt);
1060cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng  } else {
1061cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng    // Merge UsedBlocks info if the destination is a virtual register.
1062cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng    LiveVariables::VarInfo& dVI = lv_->getVarInfo(repDstReg);
1063cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng    LiveVariables::VarInfo& sVI = lv_->getVarInfo(repSrcReg);
1064cf596c54d4089ef23ce00be04bbb674d3ae2e0a6Evan Cheng    dVI.UsedBlocks |= sVI.UsedBlocks;
1065c114b2cad7293d98686d380273085f5c32966b52Chris Lattner  }
1066c114b2cad7293d98686d380273085f5c32966b52Chris Lattner
1067bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << "\n\t\tJoined.  Result = "; DestInt.print(DOUT, mri_);
1068bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << "\n";
106930cac02a925c9d56613711b0e77099cb7252bc9bEvan Cheng
107088d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng  // Remember these liveintervals have been joined.
107188d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng  JoinedLIs.set(repSrcReg - MRegisterInfo::FirstVirtualRegister);
107288d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng  if (MRegisterInfo::isVirtualRegister(repDstReg))
107388d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng    JoinedLIs.set(repDstReg - MRegisterInfo::FirstVirtualRegister);
107430cac02a925c9d56613711b0e77099cb7252bc9bEvan Cheng
1075da2295e631ae07788f7db53efa3bea6367e7656cEvan Cheng  // If the intervals were swapped by Join, swap them back so that the register
1076da2295e631ae07788f7db53efa3bea6367e7656cEvan Cheng  // mapping (in the r2i map) is correct.
1077da2295e631ae07788f7db53efa3bea6367e7656cEvan Cheng  if (Swapped) SrcInt.swap(DestInt);
1078b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  removeInterval(repSrcReg);
1079b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  r2rMap_[repSrcReg] = repDstReg;
1080e7f729b42b54fa751ba3524e1c597aad6d3ec3d7Chris Lattner
1081bfe180af9eef1cf767f61f501ca325fcce2ae7ceChris Lattner  // Finally, delete the copy instruction.
1082bfe180af9eef1cf767f61f501ca325fcce2ae7ceChris Lattner  RemoveMachineInstrFromMaps(CopyMI);
1083bfe180af9eef1cf767f61f501ca325fcce2ae7ceChris Lattner  CopyMI->eraseFromParent();
1084bfe180af9eef1cf767f61f501ca325fcce2ae7ceChris Lattner  ++numPeep;
1085f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  ++numJoins;
1086f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  return true;
1087dd2cc65f34f9b7bfda1cd0c42becedfc361d46f8Alkis Evlogimenos}
1088dd2cc65f34f9b7bfda1cd0c42becedfc361d46f8Alkis Evlogimenos
10896d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner/// ComputeUltimateVN - Assuming we are going to join two live intervals,
10906d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner/// compute what the resultant value numbers for each value in the input two
10916d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner/// ranges will be.  This is complicated by copies between the two which can
10926d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner/// and will commonly cause multiple value numbers to be merged into one.
10936d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner///
10946d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner/// VN is the value number that we're trying to resolve.  InstDefiningValue
10956d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner/// keeps track of the new InstDefiningValue assignment for the result
10966d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner/// LiveInterval.  ThisFromOther/OtherFromThis are sets that keep track of
10976d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner/// whether a value in this or other is a copy from the opposite set.
10986d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner/// ThisValNoAssignments/OtherValNoAssignments keep track of value #'s that have
10996d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner/// already been assigned.
11006d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner///
11016d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner/// ThisFromOther[x] - If x is defined as a copy from the other interval, this
11026d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner/// contains the value number the copy is from.
11036d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner///
11046d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattnerstatic unsigned ComputeUltimateVN(unsigned VN,
110591725b75852443923b419fd23215194cfc65dd88Chris Lattner                                  SmallVector<std::pair<unsigned,
110691725b75852443923b419fd23215194cfc65dd88Chris Lattner                                                unsigned>, 16> &ValueNumberInfo,
11076d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner                                  SmallVector<int, 16> &ThisFromOther,
11086d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner                                  SmallVector<int, 16> &OtherFromThis,
11096d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner                                  SmallVector<int, 16> &ThisValNoAssignments,
11106d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner                                  SmallVector<int, 16> &OtherValNoAssignments,
11116d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner                                  LiveInterval &ThisLI, LiveInterval &OtherLI) {
11126d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  // If the VN has already been computed, just return it.
11136d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  if (ThisValNoAssignments[VN] >= 0)
11146d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner    return ThisValNoAssignments[VN];
11158a67f6e848244b00dd706a7e01079d1b39c07731Chris Lattner//  assert(ThisValNoAssignments[VN] != -2 && "Cyclic case?");
11166d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner
11176d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  // If this val is not a copy from the other val, then it must be a new value
11186d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  // number in the destination.
11196d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  int OtherValNo = ThisFromOther[VN];
11206d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  if (OtherValNo == -1) {
112191725b75852443923b419fd23215194cfc65dd88Chris Lattner    ValueNumberInfo.push_back(ThisLI.getValNumInfo(VN));
112291725b75852443923b419fd23215194cfc65dd88Chris Lattner    return ThisValNoAssignments[VN] = ValueNumberInfo.size()-1;
11236d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  }
11246d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner
11258a67f6e848244b00dd706a7e01079d1b39c07731Chris Lattner  // Otherwise, this *is* a copy from the RHS.  If the other side has already
11268a67f6e848244b00dd706a7e01079d1b39c07731Chris Lattner  // been computed, return it.
11278a67f6e848244b00dd706a7e01079d1b39c07731Chris Lattner  if (OtherValNoAssignments[OtherValNo] >= 0)
11288a67f6e848244b00dd706a7e01079d1b39c07731Chris Lattner    return ThisValNoAssignments[VN] = OtherValNoAssignments[OtherValNo];
11298a67f6e848244b00dd706a7e01079d1b39c07731Chris Lattner
11308a67f6e848244b00dd706a7e01079d1b39c07731Chris Lattner  // Mark this value number as currently being computed, then ask what the
11318a67f6e848244b00dd706a7e01079d1b39c07731Chris Lattner  // ultimate value # of the other value is.
11326d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  ThisValNoAssignments[VN] = -2;
11336d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  unsigned UltimateVN =
113491725b75852443923b419fd23215194cfc65dd88Chris Lattner    ComputeUltimateVN(OtherValNo, ValueNumberInfo,
11356d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner                      OtherFromThis, ThisFromOther,
11366d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner                      OtherValNoAssignments, ThisValNoAssignments,
11376d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner                      OtherLI, ThisLI);
11386d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  return ThisValNoAssignments[VN] = UltimateVN;
11396d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner}
11406d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner
1141f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattnerstatic bool InVector(unsigned Val, const SmallVector<unsigned, 8> &V) {
1142f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  return std::find(V.begin(), V.end(), Val) != V.end();
1143f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner}
1144f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner
1145f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner/// SimpleJoin - Attempt to joint the specified interval into this one. The
1146f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner/// caller of this method must guarantee that the RHS only contains a single
1147f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner/// value number and that the RHS is not defined by a copy from this
1148f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner/// interval.  This returns false if the intervals are not joinable, or it
1149f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner/// joins them and returns true.
1150f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattnerbool LiveIntervals::SimpleJoin(LiveInterval &LHS, LiveInterval &RHS) {
1151f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  assert(RHS.containsOneValue());
1152f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner
1153f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  // Some number (potentially more than one) value numbers in the current
1154f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  // interval may be defined as copies from the RHS.  Scan the overlapping
1155f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  // portions of the LHS and RHS, keeping track of this and looking for
1156f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  // overlapping live ranges that are NOT defined as copies.  If these exist, we
1157f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  // cannot coallesce.
1158f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner
1159f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  LiveInterval::iterator LHSIt = LHS.begin(), LHSEnd = LHS.end();
1160f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  LiveInterval::iterator RHSIt = RHS.begin(), RHSEnd = RHS.end();
1161f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner
1162f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  if (LHSIt->start < RHSIt->start) {
1163f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    LHSIt = std::upper_bound(LHSIt, LHSEnd, RHSIt->start);
1164f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    if (LHSIt != LHS.begin()) --LHSIt;
1165f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  } else if (RHSIt->start < LHSIt->start) {
1166f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    RHSIt = std::upper_bound(RHSIt, RHSEnd, LHSIt->start);
1167f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    if (RHSIt != RHS.begin()) --RHSIt;
1168f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  }
1169f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner
1170f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  SmallVector<unsigned, 8> EliminatedLHSVals;
1171f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner
1172f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  while (1) {
1173f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    // Determine if these live intervals overlap.
1174f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    bool Overlaps = false;
1175f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    if (LHSIt->start <= RHSIt->start)
1176f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      Overlaps = LHSIt->end > RHSIt->start;
1177f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    else
1178f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      Overlaps = RHSIt->end > LHSIt->start;
1179f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner
1180f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    // If the live intervals overlap, there are two interesting cases: if the
1181f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    // LHS interval is defined by a copy from the RHS, it's ok and we record
1182f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    // that the LHS value # is the same as the RHS.  If it's not, then we cannot
1183f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    // coallesce these live ranges and we bail out.
1184f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    if (Overlaps) {
1185f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      // If we haven't already recorded that this value # is safe, check it.
1186f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      if (!InVector(LHSIt->ValId, EliminatedLHSVals)) {
1187f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner        // Copy from the RHS?
1188f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner        unsigned SrcReg = LHS.getSrcRegForValNum(LHSIt->ValId);
1189f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner        if (rep(SrcReg) != RHS.reg)
1190f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner          return false;    // Nope, bail out.
1191f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner
1192f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner        EliminatedLHSVals.push_back(LHSIt->ValId);
1193f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      }
1194f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner
1195f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      // We know this entire LHS live range is okay, so skip it now.
1196f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      if (++LHSIt == LHSEnd) break;
1197f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      continue;
1198f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    }
1199f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner
1200f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    if (LHSIt->end < RHSIt->end) {
1201f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      if (++LHSIt == LHSEnd) break;
1202f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    } else {
1203f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      // One interesting case to check here.  It's possible that we have
1204f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      // something like "X3 = Y" which defines a new value number in the LHS,
1205f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      // and is the last use of this liverange of the RHS.  In this case, we
1206f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      // want to notice this copy (so that it gets coallesced away) even though
1207f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      // the live ranges don't actually overlap.
1208f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      if (LHSIt->start == RHSIt->end) {
1209f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner        if (InVector(LHSIt->ValId, EliminatedLHSVals)) {
1210f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner          // We already know that this value number is going to be merged in
1211f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner          // if coallescing succeeds.  Just skip the liverange.
1212f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner          if (++LHSIt == LHSEnd) break;
1213f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner        } else {
1214f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner          // Otherwise, if this is a copy from the RHS, mark it as being merged
1215f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner          // in.
1216f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner          if (rep(LHS.getSrcRegForValNum(LHSIt->ValId)) == RHS.reg) {
1217f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner            EliminatedLHSVals.push_back(LHSIt->ValId);
1218f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner
1219f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner            // We know this entire LHS live range is okay, so skip it now.
1220f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner            if (++LHSIt == LHSEnd) break;
1221f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner          }
1222f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner        }
1223f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      }
1224f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner
1225f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      if (++RHSIt == RHSEnd) break;
1226f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    }
1227f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  }
1228f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner
1229f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  // If we got here, we know that the coallescing will be successful and that
1230f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  // the value numbers in EliminatedLHSVals will all be merged together.  Since
1231f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  // the most common case is that EliminatedLHSVals has a single number, we
1232f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  // optimize for it: if there is more than one value, we merge them all into
1233f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  // the lowest numbered one, then handle the interval as if we were merging
1234f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  // with one value number.
1235f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  unsigned LHSValNo;
1236f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  if (EliminatedLHSVals.size() > 1) {
1237f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    // Loop through all the equal value numbers merging them into the smallest
1238f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    // one.
1239f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    unsigned Smallest = EliminatedLHSVals[0];
1240f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    for (unsigned i = 1, e = EliminatedLHSVals.size(); i != e; ++i) {
1241f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      if (EliminatedLHSVals[i] < Smallest) {
1242f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner        // Merge the current notion of the smallest into the smaller one.
1243f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner        LHS.MergeValueNumberInto(Smallest, EliminatedLHSVals[i]);
1244f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner        Smallest = EliminatedLHSVals[i];
1245f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      } else {
1246f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner        // Merge into the smallest.
1247f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner        LHS.MergeValueNumberInto(EliminatedLHSVals[i], Smallest);
1248f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      }
1249f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    }
1250f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    LHSValNo = Smallest;
1251f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  } else {
1252f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    assert(!EliminatedLHSVals.empty() && "No copies from the RHS?");
1253f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    LHSValNo = EliminatedLHSVals[0];
1254f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  }
1255f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner
1256f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  // Okay, now that there is a single LHS value number that we're merging the
1257f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  // RHS into, update the value number info for the LHS to indicate that the
1258f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  // value number is defined where the RHS value number was.
1259f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  LHS.setValueNumberInfo(LHSValNo, RHS.getValNumInfo(0));
1260f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner
1261f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  // Okay, the final step is to loop over the RHS live intervals, adding them to
1262f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  // the LHS.
1263f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  LHS.MergeRangesInAsValue(RHS, LHSValNo);
1264f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  LHS.weight += RHS.weight;
1265f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner
1266f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner  return true;
1267f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner}
1268f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner
12696d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner/// JoinIntervals - Attempt to join these two intervals.  On failure, this
12706d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner/// returns false.  Otherwise, if one of the intervals being joined is a
12716d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner/// physreg, this method always canonicalizes LHS to be it.  The output
12726d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner/// "RHS" will not have been modified, so we can use this information
12736d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner/// below to update aliases.
12746d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattnerbool LiveIntervals::JoinIntervals(LiveInterval &LHS, LiveInterval &RHS) {
12752ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner  // Compute the final value assignment, assuming that the live ranges can be
12762ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner  // coallesced.
12776d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  SmallVector<int, 16> LHSValNoAssignments;
12786d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  SmallVector<int, 16> RHSValNoAssignments;
127991725b75852443923b419fd23215194cfc65dd88Chris Lattner  SmallVector<std::pair<unsigned,unsigned>, 16> ValueNumberInfo;
1280238416c99b2a2baea06ac05a5964bbbbf660f3ddChris Lattner
12816d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  // Compute ultimate value numbers for the LHS and RHS values.
12822ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner  if (RHS.containsOneValue()) {
12832ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    // Copies from a liveinterval with a single value are simple to handle and
12842ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    // very common, handle the special case here.  This is important, because
12852ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    // often RHS is small and LHS is large (e.g. a physreg).
12862ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner
12872ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    // Find out if the RHS is defined as a copy from some value in the LHS.
12882ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    int RHSValID = -1;
12892ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    std::pair<unsigned,unsigned> RHSValNoInfo;
1290f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    unsigned RHSSrcReg = RHS.getSrcRegForValNum(0);
1291f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    if ((RHSSrcReg == 0 || rep(RHSSrcReg) != LHS.reg)) {
1292f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      // If RHS is not defined as a copy from the LHS, we can use simpler and
1293f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      // faster checks to see if the live ranges are coallescable.  This joiner
1294f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      // can't swap the LHS/RHS intervals though.
1295f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      if (!MRegisterInfo::isPhysicalRegister(RHS.reg)) {
1296f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner        return SimpleJoin(LHS, RHS);
12972ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner      } else {
1298f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner        RHSValNoInfo = RHS.getValNumInfo(0);
12992ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner      }
13002ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    } else {
1301f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      // It was defined as a copy from the LHS, find out what value # it is.
1302f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      unsigned ValInst = RHS.getInstForValNum(0);
1303f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      RHSValID = LHS.getLiveRangeContaining(ValInst-1)->ValId;
1304f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner      RHSValNoInfo = LHS.getValNumInfo(RHSValID);
13052ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    }
13062ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner
1307f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    LHSValNoAssignments.resize(LHS.getNumValNums(), -1);
1308f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    RHSValNoAssignments.resize(RHS.getNumValNums(), -1);
13092ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    ValueNumberInfo.resize(LHS.getNumValNums());
13102ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner
13112ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    // Okay, *all* of the values in LHS that are defined as a copy from RHS
13122ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    // should now get updated.
13132ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    for (unsigned VN = 0, e = LHS.getNumValNums(); VN != e; ++VN) {
13142ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner      if (unsigned LHSSrcReg = LHS.getSrcRegForValNum(VN)) {
13152ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner        if (rep(LHSSrcReg) != RHS.reg) {
13162ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner          // If this is not a copy from the RHS, its value number will be
13172ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner          // unmodified by the coallescing.
13182ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner          ValueNumberInfo[VN] = LHS.getValNumInfo(VN);
13192ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner          LHSValNoAssignments[VN] = VN;
13202ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner        } else if (RHSValID == -1) {
13212ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner          // Otherwise, it is a copy from the RHS, and we don't already have a
13222ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner          // value# for it.  Keep the current value number, but remember it.
13232ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner          LHSValNoAssignments[VN] = RHSValID = VN;
13242ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner          ValueNumberInfo[VN] = RHSValNoInfo;
13252ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner        } else {
13262ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner          // Otherwise, use the specified value #.
13272ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner          LHSValNoAssignments[VN] = RHSValID;
13282ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner          if (VN != (unsigned)RHSValID)
13292ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner            ValueNumberInfo[VN].first = ~1U;
13302ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner          else
13312ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner            ValueNumberInfo[VN] = RHSValNoInfo;
13322ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner        }
13332ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner      } else {
13342ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner        ValueNumberInfo[VN] = LHS.getValNumInfo(VN);
13352ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner        LHSValNoAssignments[VN] = VN;
13362ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner      }
13372ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    }
13382ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner
13392ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    assert(RHSValID != -1 && "Didn't find value #?");
13402ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    RHSValNoAssignments[0] = RHSValID;
13412ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner
13422ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner  } else {
1343238416c99b2a2baea06ac05a5964bbbbf660f3ddChris Lattner    // Loop over the value numbers of the LHS, seeing if any are defined from
1344238416c99b2a2baea06ac05a5964bbbbf660f3ddChris Lattner    // the RHS.
13452ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    SmallVector<int, 16> LHSValsDefinedFromRHS;
13462ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    LHSValsDefinedFromRHS.resize(LHS.getNumValNums(), -1);
13472ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    for (unsigned VN = 0, e = LHS.getNumValNums(); VN != e; ++VN) {
13482ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner      unsigned ValSrcReg = LHS.getSrcRegForValNum(VN);
13492ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner      if (ValSrcReg == 0)  // Src not defined by a copy?
13502ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner        continue;
13512ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner
1352238416c99b2a2baea06ac05a5964bbbbf660f3ddChris Lattner      // DstReg is known to be a register in the LHS interval.  If the src is
1353238416c99b2a2baea06ac05a5964bbbbf660f3ddChris Lattner      // from the RHS interval, we can use its value #.
13542ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner      if (rep(ValSrcReg) != RHS.reg)
13552ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner        continue;
13562ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner
13572ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner      // Figure out the value # from the RHS.
13582ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner      unsigned ValInst = LHS.getInstForValNum(VN);
13592ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner      LHSValsDefinedFromRHS[VN] = RHS.getLiveRangeContaining(ValInst-1)->ValId;
13602ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    }
13612ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner
1362238416c99b2a2baea06ac05a5964bbbbf660f3ddChris Lattner    // Loop over the value numbers of the RHS, seeing if any are defined from
1363238416c99b2a2baea06ac05a5964bbbbf660f3ddChris Lattner    // the LHS.
13642ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    SmallVector<int, 16> RHSValsDefinedFromLHS;
13652ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    RHSValsDefinedFromLHS.resize(RHS.getNumValNums(), -1);
13662ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    for (unsigned VN = 0, e = RHS.getNumValNums(); VN != e; ++VN) {
13672ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner      unsigned ValSrcReg = RHS.getSrcRegForValNum(VN);
13682ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner      if (ValSrcReg == 0)  // Src not defined by a copy?
13692ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner        continue;
13702ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner
1371238416c99b2a2baea06ac05a5964bbbbf660f3ddChris Lattner      // DstReg is known to be a register in the RHS interval.  If the src is
1372238416c99b2a2baea06ac05a5964bbbbf660f3ddChris Lattner      // from the LHS interval, we can use its value #.
13732ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner      if (rep(ValSrcReg) != LHS.reg)
13742ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner        continue;
13752ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner
13762ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner      // Figure out the value # from the LHS.
13772ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner      unsigned ValInst = RHS.getInstForValNum(VN);
13782ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner      RHSValsDefinedFromLHS[VN] = LHS.getLiveRangeContaining(ValInst-1)->ValId;
13792ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    }
13802ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner
1381f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    LHSValNoAssignments.resize(LHS.getNumValNums(), -1);
1382f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    RHSValNoAssignments.resize(RHS.getNumValNums(), -1);
1383f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner    ValueNumberInfo.reserve(LHS.getNumValNums() + RHS.getNumValNums());
1384f21f0205b5dec61f165518887f54e01ab5aab13cChris Lattner
13852ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    for (unsigned VN = 0, e = LHS.getNumValNums(); VN != e; ++VN) {
13868a67f6e848244b00dd706a7e01079d1b39c07731Chris Lattner      if (LHSValNoAssignments[VN] >= 0 || LHS.getInstForValNum(VN) == ~2U)
13878a67f6e848244b00dd706a7e01079d1b39c07731Chris Lattner        continue;
13882ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner      ComputeUltimateVN(VN, ValueNumberInfo,
13892ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner                        LHSValsDefinedFromRHS, RHSValsDefinedFromLHS,
13902ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner                        LHSValNoAssignments, RHSValNoAssignments, LHS, RHS);
13912ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    }
13922ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    for (unsigned VN = 0, e = RHS.getNumValNums(); VN != e; ++VN) {
13938a67f6e848244b00dd706a7e01079d1b39c07731Chris Lattner      if (RHSValNoAssignments[VN] >= 0 || RHS.getInstForValNum(VN) == ~2U)
13948a67f6e848244b00dd706a7e01079d1b39c07731Chris Lattner        continue;
13958a67f6e848244b00dd706a7e01079d1b39c07731Chris Lattner      // If this value number isn't a copy from the LHS, it's a new number.
13968a67f6e848244b00dd706a7e01079d1b39c07731Chris Lattner      if (RHSValsDefinedFromLHS[VN] == -1) {
13978a67f6e848244b00dd706a7e01079d1b39c07731Chris Lattner        ValueNumberInfo.push_back(RHS.getValNumInfo(VN));
13988a67f6e848244b00dd706a7e01079d1b39c07731Chris Lattner        RHSValNoAssignments[VN] = ValueNumberInfo.size()-1;
13998a67f6e848244b00dd706a7e01079d1b39c07731Chris Lattner        continue;
14008a67f6e848244b00dd706a7e01079d1b39c07731Chris Lattner      }
14018a67f6e848244b00dd706a7e01079d1b39c07731Chris Lattner
14022ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner      ComputeUltimateVN(VN, ValueNumberInfo,
14032ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner                        RHSValsDefinedFromLHS, LHSValsDefinedFromRHS,
14042ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner                        RHSValNoAssignments, LHSValNoAssignments, RHS, LHS);
14052ebfa0c61823c5d7528b1b3235106c30cb8d53f1Chris Lattner    }
14066d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  }
14076d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner
14086d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  // Armed with the mappings of LHS/RHS values to ultimate values, walk the
14096d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  // interval lists to see if these intervals are coallescable.
14106d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  LiveInterval::const_iterator I = LHS.begin();
14116d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  LiveInterval::const_iterator IE = LHS.end();
14126d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  LiveInterval::const_iterator J = RHS.begin();
14136d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  LiveInterval::const_iterator JE = RHS.end();
14146d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner
14156d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  // Skip ahead until the first place of potential sharing.
14166d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  if (I->start < J->start) {
14176d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner    I = std::upper_bound(I, IE, J->start);
14186d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner    if (I != LHS.begin()) --I;
14196d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  } else if (J->start < I->start) {
14206d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner    J = std::upper_bound(J, JE, I->start);
14216d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner    if (J != RHS.begin()) --J;
14226d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  }
14236d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner
14246d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  while (1) {
14256d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner    // Determine if these two live ranges overlap.
14266d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner    bool Overlaps;
14276d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner    if (I->start < J->start) {
14286d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner      Overlaps = I->end > J->start;
14296d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner    } else {
14306d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner      Overlaps = J->end > I->start;
14316d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner    }
14326d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner
14336d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner    // If so, check value # info to determine if they are really different.
14346d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner    if (Overlaps) {
14356d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner      // If the live range overlap will map to the same value number in the
14366d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner      // result liverange, we can still coallesce them.  If not, we can't.
14376d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner      if (LHSValNoAssignments[I->ValId] != RHSValNoAssignments[J->ValId])
14386d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner        return false;
14396d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner    }
14406d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner
14416d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner    if (I->end < J->end) {
14426d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner      ++I;
14436d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner      if (I == IE) break;
14446d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner    } else {
14456d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner      ++J;
14466d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner      if (J == JE) break;
14476d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner    }
14486d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  }
14496d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner
14506d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  // If we get here, we know that we can coallesce the live ranges.  Ask the
14516d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  // intervals to coallesce themselves now.
14526d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  LHS.join(RHS, &LHSValNoAssignments[0], &RHSValNoAssignments[0],
145391725b75852443923b419fd23215194cfc65dd88Chris Lattner           ValueNumberInfo);
14546d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner  return true;
14556d8fbef015ff836bcb8f64f52c49805e43f8ea9fChris Lattner}
1456f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner
1457f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner
1458cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattnernamespace {
1459cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner  // DepthMBBCompare - Comparison predicate that sort first based on the loop
1460cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner  // depth of the basic block (the unsigned), and then on the MBB number.
1461cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner  struct DepthMBBCompare {
1462cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner    typedef std::pair<unsigned, MachineBasicBlock*> DepthMBBPair;
1463cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner    bool operator()(const DepthMBBPair &LHS, const DepthMBBPair &RHS) const {
1464cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner      if (LHS.first > RHS.first) return true;   // Deeper loops first
1465706515727c6d024015fffded2b3109a4f0ac5299Alkis Evlogimenos      return LHS.first == RHS.first &&
14661a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        LHS.second->getNumber() < RHS.second->getNumber();
1467cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner    }
1468cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner  };
1469cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner}
1470cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner
1471f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner
14721acb17cb8392dce33079fe45f383944ec6616757Chris Lattnervoid LiveIntervals::CopyCoallesceInMBB(MachineBasicBlock *MBB,
14731acb17cb8392dce33079fe45f383944ec6616757Chris Lattner                                       std::vector<CopyRec> &TryAgain) {
1474bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << ((Value*)MBB->getBasicBlock())->getName() << ":\n";
1475f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner
1476f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  for (MachineBasicBlock::iterator MII = MBB->begin(), E = MBB->end();
1477f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner       MII != E;) {
1478f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner    MachineInstr *Inst = MII++;
1479f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner
1480f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner    // If this isn't a copy, we can't join intervals.
1481f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner    unsigned SrcReg, DstReg;
1482f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner    if (!tii_->isMoveInstr(*Inst, SrcReg, DstReg)) continue;
1483f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner
14841acb17cb8392dce33079fe45f383944ec6616757Chris Lattner    if (!JoinCopy(Inst, SrcReg, DstReg))
14851acb17cb8392dce33079fe45f383944ec6616757Chris Lattner      TryAgain.push_back(getCopyRec(Inst, SrcReg, DstReg));
1486f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  }
1487f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner}
1488f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner
1489f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner
1490cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattnervoid LiveIntervals::joinIntervals() {
1491bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << "********** JOINING INTERVALS ***********\n";
14921c5c0444f1326b58cf05015651f36f2b04ca322dChris Lattner
149388d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng  JoinedLIs.resize(getNumIntervals());
149488d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng  JoinedLIs.reset();
149588d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng
14961acb17cb8392dce33079fe45f383944ec6616757Chris Lattner  std::vector<CopyRec> TryAgainList;
1497cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner  const LoopInfo &LI = getAnalysis<LoopInfo>();
1498cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner  if (LI.begin() == LI.end()) {
1499cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner    // If there are no loops in the function, join intervals in function order.
15001c5c0444f1326b58cf05015651f36f2b04ca322dChris Lattner    for (MachineFunction::iterator I = mf_->begin(), E = mf_->end();
15011c5c0444f1326b58cf05015651f36f2b04ca322dChris Lattner         I != E; ++I)
15021acb17cb8392dce33079fe45f383944ec6616757Chris Lattner      CopyCoallesceInMBB(I, TryAgainList);
1503cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner  } else {
1504cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner    // Otherwise, join intervals in inner loops before other intervals.
1505cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner    // Unfortunately we can't just iterate over loop hierarchy here because
1506cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner    // there may be more MBB's than BB's.  Collect MBB's for sorting.
1507cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner    std::vector<std::pair<unsigned, MachineBasicBlock*> > MBBs;
1508cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner    for (MachineFunction::iterator I = mf_->begin(), E = mf_->end();
1509cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner         I != E; ++I)
1510cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner      MBBs.push_back(std::make_pair(LI.getLoopDepth(I->getBasicBlock()), I));
1511cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner
1512cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner    // Sort by loop depth.
1513cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner    std::sort(MBBs.begin(), MBBs.end(), DepthMBBCompare());
1514cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner
1515706515727c6d024015fffded2b3109a4f0ac5299Alkis Evlogimenos    // Finally, join intervals in loop nest order.
1516cc0d156f7bca0811aade0a95b0e7419176383c90Chris Lattner    for (unsigned i = 0, e = MBBs.size(); i != e; ++i)
15171acb17cb8392dce33079fe45f383944ec6616757Chris Lattner      CopyCoallesceInMBB(MBBs[i].second, TryAgainList);
15181acb17cb8392dce33079fe45f383944ec6616757Chris Lattner  }
15191acb17cb8392dce33079fe45f383944ec6616757Chris Lattner
15201acb17cb8392dce33079fe45f383944ec6616757Chris Lattner  // Joining intervals can allow other intervals to be joined.  Iteratively join
15211acb17cb8392dce33079fe45f383944ec6616757Chris Lattner  // until we make no progress.
15221acb17cb8392dce33079fe45f383944ec6616757Chris Lattner  bool ProgressMade = true;
15231acb17cb8392dce33079fe45f383944ec6616757Chris Lattner  while (ProgressMade) {
15241acb17cb8392dce33079fe45f383944ec6616757Chris Lattner    ProgressMade = false;
15251acb17cb8392dce33079fe45f383944ec6616757Chris Lattner
15261acb17cb8392dce33079fe45f383944ec6616757Chris Lattner    for (unsigned i = 0, e = TryAgainList.size(); i != e; ++i) {
15271acb17cb8392dce33079fe45f383944ec6616757Chris Lattner      CopyRec &TheCopy = TryAgainList[i];
15281acb17cb8392dce33079fe45f383944ec6616757Chris Lattner      if (TheCopy.MI &&
15291acb17cb8392dce33079fe45f383944ec6616757Chris Lattner          JoinCopy(TheCopy.MI, TheCopy.SrcReg, TheCopy.DstReg)) {
15301acb17cb8392dce33079fe45f383944ec6616757Chris Lattner        TheCopy.MI = 0;   // Mark this one as done.
15311acb17cb8392dce33079fe45f383944ec6616757Chris Lattner        ProgressMade = true;
15321acb17cb8392dce33079fe45f383944ec6616757Chris Lattner      }
15331acb17cb8392dce33079fe45f383944ec6616757Chris Lattner    }
1534f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner  }
153588d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng
153688d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng  // Some live range has been lengthened due to colaescing, eliminate the
153788d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng  // unnecessary kills.
153888d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng  int RegNum = JoinedLIs.find_first();
153988d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng  while (RegNum != -1) {
154088d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng    unsigned Reg = RegNum + MRegisterInfo::FirstVirtualRegister;
154188d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng    unsigned repReg = rep(Reg);
154288d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng    LiveInterval &LI = getInterval(repReg);
154388d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng    LiveVariables::VarInfo& svi = lv_->getVarInfo(Reg);
154488d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng    for (unsigned i = 0, e = svi.Kills.size(); i != e; ++i) {
154588d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng      MachineInstr *Kill = svi.Kills[i];
154688d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng      // Suppose vr1 = op vr2, x
154788d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng      // and vr1 and vr2 are coalesced. vr2 should still be marked kill
154888d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng      // unless it is a two-address operand.
154988d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng      if (isRemoved(Kill) || hasRegisterDef(Kill, repReg))
155088d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng        continue;
155188d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng      if (LI.liveAt(getInstructionIndex(Kill) + InstrSlots::NUM))
155288d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng        unsetRegisterKill(Kill, repReg);
155388d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng    }
155488d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng    RegNum = JoinedLIs.find_next(RegNum);
155588d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng  }
1556f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattner
1557bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << "*** Register mapping ***\n";
1558bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  for (int i = 0, e = r2rMap_.size(); i != e; ++i)
1559bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    if (r2rMap_[i]) {
1560bdc679d564e67a81792e463f6614b0088f975025Bill Wendling      DOUT << "  reg " << i << " -> ";
1561bdc679d564e67a81792e463f6614b0088f975025Bill Wendling      DEBUG(printRegName(r2rMap_[i]));
1562bdc679d564e67a81792e463f6614b0088f975025Bill Wendling      DOUT << "\n";
1563bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    }
15641c5c0444f1326b58cf05015651f36f2b04ca322dChris Lattner}
15651c5c0444f1326b58cf05015651f36f2b04ca322dChris Lattner
1566647c15e58ed4c3fda81041d401ca7547639958dcEvan Cheng/// Return true if the two specified registers belong to different register
1567647c15e58ed4c3fda81041d401ca7547639958dcEvan Cheng/// classes.  The registers may be either phys or virt regs.
1568647c15e58ed4c3fda81041d401ca7547639958dcEvan Chengbool LiveIntervals::differingRegisterClasses(unsigned RegA,
1569647c15e58ed4c3fda81041d401ca7547639958dcEvan Cheng                                             unsigned RegB) const {
15707ac2d3146a196fa0120c579ecd2ddd69652ad230Chris Lattner
15717ac2d3146a196fa0120c579ecd2ddd69652ad230Chris Lattner  // Get the register classes for the first reg.
1572ad3c74fc9b52b652859807580c8e40b67394d689Chris Lattner  if (MRegisterInfo::isPhysicalRegister(RegA)) {
1573edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman    assert(MRegisterInfo::isVirtualRegister(RegB) &&
1574ad3c74fc9b52b652859807580c8e40b67394d689Chris Lattner           "Shouldn't consider two physregs!");
1575647c15e58ed4c3fda81041d401ca7547639958dcEvan Cheng    return !mf_->getSSARegMap()->getRegClass(RegB)->contains(RegA);
1576ad3c74fc9b52b652859807580c8e40b67394d689Chris Lattner  }
15777ac2d3146a196fa0120c579ecd2ddd69652ad230Chris Lattner
15787ac2d3146a196fa0120c579ecd2ddd69652ad230Chris Lattner  // Compare against the regclass for the second reg.
1579647c15e58ed4c3fda81041d401ca7547639958dcEvan Cheng  const TargetRegisterClass *RegClass = mf_->getSSARegMap()->getRegClass(RegA);
1580647c15e58ed4c3fda81041d401ca7547639958dcEvan Cheng  if (MRegisterInfo::isVirtualRegister(RegB))
1581647c15e58ed4c3fda81041d401ca7547639958dcEvan Cheng    return RegClass != mf_->getSSARegMap()->getRegClass(RegB);
1582647c15e58ed4c3fda81041d401ca7547639958dcEvan Cheng  else
1583647c15e58ed4c3fda81041d401ca7547639958dcEvan Cheng    return !RegClass->contains(RegB);
15847ac2d3146a196fa0120c579ecd2ddd69652ad230Chris Lattner}
15857ac2d3146a196fa0120c579ecd2ddd69652ad230Chris Lattner
1586edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng/// lastRegisterUse - Returns the last use of the specific register between
1587edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng/// cycles Start and End. It also returns the use operand by reference. It
1588edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng/// returns NULL if there are no uses.
1589edeffb37dc41591b3d3943a5c02c04e55d348524Evan ChengMachineInstr *
1590edeffb37dc41591b3d3943a5c02c04e55d348524Evan ChengLiveIntervals::lastRegisterUse(unsigned Reg, unsigned Start, unsigned End,
1591edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng                               MachineOperand *&MOU) {
1592edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng  int e = (End-1) / InstrSlots::NUM * InstrSlots::NUM;
1593edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng  int s = Start;
1594edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng  while (e >= s) {
1595b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    // Skip deleted instructions
1596edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng    MachineInstr *MI = getInstructionFromIndex(e);
1597edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng    while ((e - InstrSlots::NUM) >= s && !MI) {
1598edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng      e -= InstrSlots::NUM;
1599edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng      MI = getInstructionFromIndex(e);
1600edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng    }
1601edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng    if (e < s || MI == NULL)
1602edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng      return NULL;
1603b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
1604edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng    for (unsigned i = 0, NumOps = MI->getNumOperands(); i != NumOps; ++i) {
1605b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      MachineOperand &MO = MI->getOperand(i);
1606b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      if (MO.isReg() && MO.isUse() && MO.getReg() &&
1607edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng          mri_->regsOverlap(rep(MO.getReg()), Reg)) {
1608edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng        MOU = &MO;
1609edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng        return MI;
1610edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng      }
1611b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    }
1612edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng
1613edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng    e -= InstrSlots::NUM;
1614b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  }
1615b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
1616edeffb37dc41591b3d3943a5c02c04e55d348524Evan Cheng  return NULL;
1617b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng}
1618b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
161930cac02a925c9d56613711b0e77099cb7252bc9bEvan Cheng/// unsetRegisterKill - Unset IsKill property of all uses of specific register
162030cac02a925c9d56613711b0e77099cb7252bc9bEvan Cheng/// of the specific instruction.
162130cac02a925c9d56613711b0e77099cb7252bc9bEvan Chengvoid LiveIntervals::unsetRegisterKill(MachineInstr *MI, unsigned Reg) {
162230cac02a925c9d56613711b0e77099cb7252bc9bEvan Cheng  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
162330cac02a925c9d56613711b0e77099cb7252bc9bEvan Cheng    MachineOperand &MO = MI->getOperand(i);
162430cac02a925c9d56613711b0e77099cb7252bc9bEvan Cheng    if (MO.isReg() && MO.isUse() && MO.isKill() && MO.getReg() &&
162530cac02a925c9d56613711b0e77099cb7252bc9bEvan Cheng        mri_->regsOverlap(rep(MO.getReg()), Reg))
162630cac02a925c9d56613711b0e77099cb7252bc9bEvan Cheng      MO.unsetIsKill();
162730cac02a925c9d56613711b0e77099cb7252bc9bEvan Cheng  }
162830cac02a925c9d56613711b0e77099cb7252bc9bEvan Cheng}
162930cac02a925c9d56613711b0e77099cb7252bc9bEvan Cheng
163088d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng/// hasRegisterDef - True if the instruction defines the specific register.
163188d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng///
163288d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Chengbool LiveIntervals::hasRegisterDef(MachineInstr *MI, unsigned Reg) {
163388d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
163488d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng    MachineOperand &MO = MI->getOperand(i);
163588d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng    if (MO.isReg() && MO.isDef() &&
163688d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng        mri_->regsOverlap(rep(MO.getReg()), Reg))
163788d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng      return true;
163888d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng  }
163988d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng  return false;
164088d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng}
164188d1f587d2205b4275dc4c0319a5f2d4d1e6fd42Evan Cheng
1642a1613db62fec94845aa8306232fb665273615badAlkis EvlogimenosLiveInterval LiveIntervals::createInterval(unsigned reg) {
1643edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman  float Weight = MRegisterInfo::isPhysicalRegister(reg) ?
16447902c75331fa8f38fc8380f5573d935c0d149ef5Jim Laskey                       HUGE_VALF : 0.0F;
1645a1613db62fec94845aa8306232fb665273615badAlkis Evlogimenos  return LiveInterval(reg, Weight);
16469a8b490735d216435862a3d52e669357f165550fAlkis Evlogimenos}
1647