LiveIntervalAnalysis.cpp revision 4f8ff168de12eabdeb4b9437bf9402489ecf85cb
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"
3320b0abc24fb3fa15098b7cb12c7762fb0770e133Evan Cheng#include "llvm/ADT/SmallSet.h"
34551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/ADT/Statistic.h"
35551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/ADT/STLExtras.h"
3620aa474f8fbebde588edc101b90e834df28ce4ceAlkis Evlogimenos#include <algorithm>
3797af751deb9b26fd42fbcee082da9ccc4ded5b45Jeff Cohen#include <cmath>
38ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenosusing namespace llvm;
39ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
40cd3245ac45c595da96bb768a55cddc356dff55feChris LattnerSTATISTIC(numIntervals, "Number of original intervals");
41cd3245ac45c595da96bb768a55cddc356dff55feChris LattnerSTATISTIC(numIntervalsAfter, "Number of intervals after coalescing");
42cd3245ac45c595da96bb768a55cddc356dff55feChris LattnerSTATISTIC(numFolded   , "Number of loads/stores folded into instructions");
43cd3245ac45c595da96bb768a55cddc356dff55feChris Lattner
441997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patelchar LiveIntervals::ID = 0;
45ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenosnamespace {
465d8925c7c506a54ebdfb0bc93437ec9f602eaaa0Chris Lattner  RegisterPass<LiveIntervals> X("liveintervals", "Live Interval Analysis");
47d74ea2bbd8bb630331f35ead42d385249bd42af8Chris Lattner}
48ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
49f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattnervoid LiveIntervals::getAnalysisUsage(AnalysisUsage &AU) const {
502513330de8f8020d15d5bc96640a0957b7c733b9David Greene  AU.addPreserved<LiveVariables>();
511a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  AU.addRequired<LiveVariables>();
521a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  AU.addPreservedID(PHIEliminationID);
531a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  AU.addRequiredID(PHIEliminationID);
541a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  AU.addRequiredID(TwoAddressInstructionPassID);
551a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  AU.addRequired<LoopInfo>();
561a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  MachineFunctionPass::getAnalysisUsage(AU);
57ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos}
58ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
59f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattnervoid LiveIntervals::releaseMemory() {
601a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  mi2iMap_.clear();
611a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  i2miMap_.clear();
621a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  r2iMap_.clear();
63993141402f57b4d4cbb7f8a3113f19c61688f9b7Evan Cheng}
64993141402f57b4d4cbb7f8a3113f19c61688f9b7Evan Cheng
65ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos/// runOnMachineFunction - Register allocate the whole function
66ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos///
67ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenosbool LiveIntervals::runOnMachineFunction(MachineFunction &fn) {
681a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  mf_ = &fn;
691a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  tm_ = &fn.getTarget();
701a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  mri_ = tm_->getRegisterInfo();
71f768bba43f5c036039851d2fcca8212edca18467Chris Lattner  tii_ = tm_->getInstrInfo();
721a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  lv_ = &getAnalysis<LiveVariables>();
7320b0abc24fb3fa15098b7cb12c7762fb0770e133Evan Cheng  allocatableRegs_ = mri_->getAllocatableSet(fn);
741a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
75428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner  // Number MachineInstrs and MachineBasicBlocks.
76428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner  // Initialize MBB indexes to a sentinal.
77428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner  MBB2IdxMap.resize(mf_->getNumBlockIDs(), ~0U);
78428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner
79428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner  unsigned MIIndex = 0;
80428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner  for (MachineFunction::iterator MBB = mf_->begin(), E = mf_->end();
81428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner       MBB != E; ++MBB) {
82428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner    // Set the MBB2IdxMap entry for this MBB.
83428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner    MBB2IdxMap[MBB->getNumber()] = MIIndex;
840c9f92e1ff64ee56724eae444a0442b02f83d0a8Evan Cheng
85428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner    for (MachineBasicBlock::iterator I = MBB->begin(), E = MBB->end();
86428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner         I != E; ++I) {
87428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner      bool inserted = mi2iMap_.insert(std::make_pair(I, MIIndex)).second;
881a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      assert(inserted && "multiple MachineInstr -> index mappings");
89428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner      i2miMap_.push_back(I);
90428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner      MIIndex += InstrSlots::NUM;
911a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    }
92428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner  }
93ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
941a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  computeIntervals();
95ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
961a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  numIntervals += getNumIntervals();
97843b160a2040b3ec4d3452678450afa11704c473Alkis Evlogimenos
98bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << "********** INTERVALS **********\n";
99bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  for (iterator I = begin(), E = end(); I != E; ++I) {
100bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    I->second.print(DOUT, mri_);
101bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    DOUT << "\n";
102bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  }
1037ac2d3146a196fa0120c579ecd2ddd69652ad230Chris Lattner
1041a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  numIntervalsAfter += getNumIntervals();
10570ca358b7d540b6061236ddf757085042873c12cChris Lattner  DEBUG(dump());
1061a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  return true;
107ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos}
108ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
10970ca358b7d540b6061236ddf757085042873c12cChris Lattner/// print - Implement the dump method.
110ce9653ce449f1409815547e1bf60abcd1332d2c9Reid Spencervoid LiveIntervals::print(std::ostream &O, const Module* ) const {
11170ca358b7d540b6061236ddf757085042873c12cChris Lattner  O << "********** INTERVALS **********\n";
1128e7a70976deee78a84099b916591d40f7a1cdc34Chris Lattner  for (const_iterator I = begin(), E = end(); I != E; ++I) {
113bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    I->second.print(DOUT, mri_);
114bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    DOUT << "\n";
1158e7a70976deee78a84099b916591d40f7a1cdc34Chris Lattner  }
11670ca358b7d540b6061236ddf757085042873c12cChris Lattner
11770ca358b7d540b6061236ddf757085042873c12cChris Lattner  O << "********** MACHINEINSTRS **********\n";
11870ca358b7d540b6061236ddf757085042873c12cChris Lattner  for (MachineFunction::iterator mbbi = mf_->begin(), mbbe = mf_->end();
11970ca358b7d540b6061236ddf757085042873c12cChris Lattner       mbbi != mbbe; ++mbbi) {
12070ca358b7d540b6061236ddf757085042873c12cChris Lattner    O << ((Value*)mbbi->getBasicBlock())->getName() << ":\n";
12170ca358b7d540b6061236ddf757085042873c12cChris Lattner    for (MachineBasicBlock::iterator mii = mbbi->begin(),
12270ca358b7d540b6061236ddf757085042873c12cChris Lattner           mie = mbbi->end(); mii != mie; ++mii) {
123477e4555de341c5de780de3720d6f115ec133c4eChris Lattner      O << getInstructionIndex(mii) << '\t' << *mii;
12470ca358b7d540b6061236ddf757085042873c12cChris Lattner    }
12570ca358b7d540b6061236ddf757085042873c12cChris Lattner  }
12670ca358b7d540b6061236ddf757085042873c12cChris Lattner}
12770ca358b7d540b6061236ddf757085042873c12cChris Lattner
1282513330de8f8020d15d5bc96640a0957b7c733b9David Greene// Not called?
12901352aa1875ee08ae847cce398322042830d92edBill Wendling/// CreateNewLiveInterval - Create a new live interval with the given live
13001352aa1875ee08ae847cce398322042830d92edBill Wendling/// ranges. The new live interval will have an infinite spill weight.
13101352aa1875ee08ae847cce398322042830d92edBill WendlingLiveInterval&
13201352aa1875ee08ae847cce398322042830d92edBill WendlingLiveIntervals::CreateNewLiveInterval(const LiveInterval *LI,
13301352aa1875ee08ae847cce398322042830d92edBill Wendling                                     const std::vector<LiveRange> &LRs) {
13401352aa1875ee08ae847cce398322042830d92edBill Wendling  const TargetRegisterClass *RC = mf_->getSSARegMap()->getRegClass(LI->reg);
13501352aa1875ee08ae847cce398322042830d92edBill Wendling
13601352aa1875ee08ae847cce398322042830d92edBill Wendling  // Create a new virtual register for the spill interval.
13701352aa1875ee08ae847cce398322042830d92edBill Wendling  unsigned NewVReg = mf_->getSSARegMap()->createVirtualRegister(RC);
13801352aa1875ee08ae847cce398322042830d92edBill Wendling
13901352aa1875ee08ae847cce398322042830d92edBill Wendling  // Replace the old virtual registers in the machine operands with the shiny
14001352aa1875ee08ae847cce398322042830d92edBill Wendling  // new one.
14101352aa1875ee08ae847cce398322042830d92edBill Wendling  for (std::vector<LiveRange>::const_iterator
14201352aa1875ee08ae847cce398322042830d92edBill Wendling         I = LRs.begin(), E = LRs.end(); I != E; ++I) {
14301352aa1875ee08ae847cce398322042830d92edBill Wendling    unsigned Index = getBaseIndex(I->start);
14401352aa1875ee08ae847cce398322042830d92edBill Wendling    unsigned End = getBaseIndex(I->end - 1) + InstrSlots::NUM;
14501352aa1875ee08ae847cce398322042830d92edBill Wendling
14601352aa1875ee08ae847cce398322042830d92edBill Wendling    for (; Index != End; Index += InstrSlots::NUM) {
14701352aa1875ee08ae847cce398322042830d92edBill Wendling      // Skip deleted instructions
14801352aa1875ee08ae847cce398322042830d92edBill Wendling      while (Index != End && !getInstructionFromIndex(Index))
14901352aa1875ee08ae847cce398322042830d92edBill Wendling        Index += InstrSlots::NUM;
15001352aa1875ee08ae847cce398322042830d92edBill Wendling
15101352aa1875ee08ae847cce398322042830d92edBill Wendling      if (Index == End) break;
15201352aa1875ee08ae847cce398322042830d92edBill Wendling
15301352aa1875ee08ae847cce398322042830d92edBill Wendling      MachineInstr *MI = getInstructionFromIndex(Index);
15401352aa1875ee08ae847cce398322042830d92edBill Wendling
155beeb77f3ae9e784f45ede2e38f51b9b25eb65913Bill Wendling      for (unsigned J = 0, e = MI->getNumOperands(); J != e; ++J) {
15601352aa1875ee08ae847cce398322042830d92edBill Wendling        MachineOperand &MOp = MI->getOperand(J);
1572513330de8f8020d15d5bc96640a0957b7c733b9David Greene        if (MOp.isRegister() && MOp.getReg() == LI->reg)
15801352aa1875ee08ae847cce398322042830d92edBill Wendling          MOp.setReg(NewVReg);
15901352aa1875ee08ae847cce398322042830d92edBill Wendling      }
16001352aa1875ee08ae847cce398322042830d92edBill Wendling    }
16101352aa1875ee08ae847cce398322042830d92edBill Wendling  }
16201352aa1875ee08ae847cce398322042830d92edBill Wendling
16301352aa1875ee08ae847cce398322042830d92edBill Wendling  LiveInterval &NewLI = getOrCreateInterval(NewVReg);
16401352aa1875ee08ae847cce398322042830d92edBill Wendling
16501352aa1875ee08ae847cce398322042830d92edBill Wendling  // The spill weight is now infinity as it cannot be spilled again
16601352aa1875ee08ae847cce398322042830d92edBill Wendling  NewLI.weight = float(HUGE_VAL);
16701352aa1875ee08ae847cce398322042830d92edBill Wendling
16801352aa1875ee08ae847cce398322042830d92edBill Wendling  for (std::vector<LiveRange>::const_iterator
16901352aa1875ee08ae847cce398322042830d92edBill Wendling         I = LRs.begin(), E = LRs.end(); I != E; ++I) {
170bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    DOUT << "  Adding live range " << *I << " to new interval\n";
17101352aa1875ee08ae847cce398322042830d92edBill Wendling    NewLI.addRange(*I);
17201352aa1875ee08ae847cce398322042830d92edBill Wendling  }
17301352aa1875ee08ae847cce398322042830d92edBill Wendling
174bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << "Created new live interval " << NewLI << "\n";
17501352aa1875ee08ae847cce398322042830d92edBill Wendling  return NewLI;
17601352aa1875ee08ae847cce398322042830d92edBill Wendling}
17701352aa1875ee08ae847cce398322042830d92edBill Wendling
17870ca358b7d540b6061236ddf757085042873c12cChris Lattnerstd::vector<LiveInterval*> LiveIntervals::
17970ca358b7d540b6061236ddf757085042873c12cChris LattneraddIntervalsForSpills(const LiveInterval &li, VirtRegMap &vrm, int slot) {
180d8d26b3268acf7f157028f0cb60a545b185e8905Alkis Evlogimenos  // since this is called after the analysis is done we don't know if
181d8d26b3268acf7f157028f0cb60a545b185e8905Alkis Evlogimenos  // LiveVariables is available
182d8d26b3268acf7f157028f0cb60a545b185e8905Alkis Evlogimenos  lv_ = getAnalysisToUpdate<LiveVariables>();
183d8d26b3268acf7f157028f0cb60a545b185e8905Alkis Evlogimenos
1841a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  std::vector<LiveInterval*> added;
1851a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
1867902c75331fa8f38fc8380f5573d935c0d149ef5Jim Laskey  assert(li.weight != HUGE_VALF &&
1871a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos         "attempt to spill already spilled interval!");
1881a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
189bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << "\t\t\t\tadding intervals for spills for interval: ";
190bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  li.print(DOUT, mri_);
191bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << '\n';
1921a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
1931a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(li.reg);
1941a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
1951a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  for (LiveInterval::Ranges::const_iterator
1961a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos         i = li.ranges.begin(), e = li.ranges.end(); i != e; ++i) {
1971a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    unsigned index = getBaseIndex(i->start);
1981a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    unsigned end = getBaseIndex(i->end-1) + InstrSlots::NUM;
1991a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    for (; index != end; index += InstrSlots::NUM) {
2001a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // skip deleted instructions
2011a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      while (index != end && !getInstructionFromIndex(index))
2021a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        index += InstrSlots::NUM;
2031a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      if (index == end) break;
2041a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
2053b9db830f7f0ed33af13459be3fd60ebe01a13caChris Lattner      MachineInstr *MI = getInstructionFromIndex(index);
2061a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
2072926869b4a083fc951484de03a9867eabf81e880Chris Lattner    RestartInstruction:
2083b9db830f7f0ed33af13459be3fd60ebe01a13caChris Lattner      for (unsigned i = 0; i != MI->getNumOperands(); ++i) {
2093b9db830f7f0ed33af13459be3fd60ebe01a13caChris Lattner        MachineOperand& mop = MI->getOperand(i);
2101a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        if (mop.isRegister() && mop.getReg() == li.reg) {
2112638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng          MachineInstr *fmi = li.remat ? NULL
2122638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng            : mri_->foldMemoryOperand(MI, i, slot);
2132638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng          if (fmi) {
214b11443dc8458b0ba72d484dacf99dffa2e8d3b51Chris Lattner            // Attempt to fold the memory reference into the instruction.  If we
215b11443dc8458b0ba72d484dacf99dffa2e8d3b51Chris Lattner            // can do this, we don't need to insert spill code.
216d8d26b3268acf7f157028f0cb60a545b185e8905Alkis Evlogimenos            if (lv_)
2173b9db830f7f0ed33af13459be3fd60ebe01a13caChris Lattner              lv_->instructionChanged(MI, fmi);
218200370fb5617a1719f0054804b412469ce486ebdEvan Cheng            MachineBasicBlock &MBB = *MI->getParent();
21935f2705e3de4600c3621b883eed9b22e4607ddf4Chris Lattner            vrm.virtFolded(li.reg, MI, i, fmi);
2203b9db830f7f0ed33af13459be3fd60ebe01a13caChris Lattner            mi2iMap_.erase(MI);
2211a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos            i2miMap_[index/InstrSlots::NUM] = fmi;
2221a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos            mi2iMap_[fmi] = index;
2233b9db830f7f0ed33af13459be3fd60ebe01a13caChris Lattner            MI = MBB.insert(MBB.erase(MI), fmi);
2241a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos            ++numFolded;
225477e4555de341c5de780de3720d6f115ec133c4eChris Lattner            // Folding the load/store can completely change the instruction in
226477e4555de341c5de780de3720d6f115ec133c4eChris Lattner            // unpredictable ways, rescan it from the beginning.
2272926869b4a083fc951484de03a9867eabf81e880Chris Lattner            goto RestartInstruction;
228477e4555de341c5de780de3720d6f115ec133c4eChris Lattner          } else {
2292926869b4a083fc951484de03a9867eabf81e880Chris Lattner            // Create a new virtual register for the spill interval.
2302926869b4a083fc951484de03a9867eabf81e880Chris Lattner            unsigned NewVReg = mf_->getSSARegMap()->createVirtualRegister(rc);
2312926869b4a083fc951484de03a9867eabf81e880Chris Lattner
2322926869b4a083fc951484de03a9867eabf81e880Chris Lattner            // Scan all of the operands of this instruction rewriting operands
2332926869b4a083fc951484de03a9867eabf81e880Chris Lattner            // to use NewVReg instead of li.reg as appropriate.  We do this for
2342926869b4a083fc951484de03a9867eabf81e880Chris Lattner            // two reasons:
2351a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos            //
2362926869b4a083fc951484de03a9867eabf81e880Chris Lattner            //   1. If the instr reads the same spilled vreg multiple times, we
2372926869b4a083fc951484de03a9867eabf81e880Chris Lattner            //      want to reuse the NewVReg.
2382926869b4a083fc951484de03a9867eabf81e880Chris Lattner            //   2. If the instr is a two-addr instruction, we are required to
2392926869b4a083fc951484de03a9867eabf81e880Chris Lattner            //      keep the src/dst regs pinned.
2402926869b4a083fc951484de03a9867eabf81e880Chris Lattner            //
2412926869b4a083fc951484de03a9867eabf81e880Chris Lattner            // Keep track of whether we replace a use and/or def so that we can
2422926869b4a083fc951484de03a9867eabf81e880Chris Lattner            // create the spill interval with the appropriate range.
2432926869b4a083fc951484de03a9867eabf81e880Chris Lattner            mop.setReg(NewVReg);
2442926869b4a083fc951484de03a9867eabf81e880Chris Lattner
2452926869b4a083fc951484de03a9867eabf81e880Chris Lattner            bool HasUse = mop.isUse();
2462926869b4a083fc951484de03a9867eabf81e880Chris Lattner            bool HasDef = mop.isDef();
2472926869b4a083fc951484de03a9867eabf81e880Chris Lattner            for (unsigned j = i+1, e = MI->getNumOperands(); j != e; ++j) {
2482926869b4a083fc951484de03a9867eabf81e880Chris Lattner              if (MI->getOperand(j).isReg() &&
2492926869b4a083fc951484de03a9867eabf81e880Chris Lattner                  MI->getOperand(j).getReg() == li.reg) {
2502926869b4a083fc951484de03a9867eabf81e880Chris Lattner                MI->getOperand(j).setReg(NewVReg);
2512926869b4a083fc951484de03a9867eabf81e880Chris Lattner                HasUse |= MI->getOperand(j).isUse();
2522926869b4a083fc951484de03a9867eabf81e880Chris Lattner                HasDef |= MI->getOperand(j).isDef();
2532926869b4a083fc951484de03a9867eabf81e880Chris Lattner              }
2542926869b4a083fc951484de03a9867eabf81e880Chris Lattner            }
2551a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
2561a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos            // create a new register for this spill
2571a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos            vrm.grow();
2582638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng            if (li.remat)
2592638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng              vrm.setVirtIsReMaterialized(NewVReg, li.remat);
2602926869b4a083fc951484de03a9867eabf81e880Chris Lattner            vrm.assignVirt2StackSlot(NewVReg, slot);
2612926869b4a083fc951484de03a9867eabf81e880Chris Lattner            LiveInterval &nI = getOrCreateInterval(NewVReg);
2622638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng            nI.remat = li.remat;
2631a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos            assert(nI.empty());
26470ca358b7d540b6061236ddf757085042873c12cChris Lattner
2651a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos            // the spill weight is now infinity as it
2661a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos            // cannot be spilled again
2677902c75331fa8f38fc8380f5573d935c0d149ef5Jim Laskey            nI.weight = HUGE_VALF;
2682926869b4a083fc951484de03a9867eabf81e880Chris Lattner
2692926869b4a083fc951484de03a9867eabf81e880Chris Lattner            if (HasUse) {
2702926869b4a083fc951484de03a9867eabf81e880Chris Lattner              LiveRange LR(getLoadIndex(index), getUseIndex(index),
2712926869b4a083fc951484de03a9867eabf81e880Chris Lattner                           nI.getNextValue(~0U, 0));
272bdc679d564e67a81792e463f6614b0088f975025Bill Wendling              DOUT << " +" << LR;
2732926869b4a083fc951484de03a9867eabf81e880Chris Lattner              nI.addRange(LR);
2742926869b4a083fc951484de03a9867eabf81e880Chris Lattner            }
2752926869b4a083fc951484de03a9867eabf81e880Chris Lattner            if (HasDef) {
2762926869b4a083fc951484de03a9867eabf81e880Chris Lattner              LiveRange LR(getDefIndex(index), getStoreIndex(index),
2772926869b4a083fc951484de03a9867eabf81e880Chris Lattner                           nI.getNextValue(~0U, 0));
278bdc679d564e67a81792e463f6614b0088f975025Bill Wendling              DOUT << " +" << LR;
2792926869b4a083fc951484de03a9867eabf81e880Chris Lattner              nI.addRange(LR);
2802926869b4a083fc951484de03a9867eabf81e880Chris Lattner            }
2812926869b4a083fc951484de03a9867eabf81e880Chris Lattner
2821a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos            added.push_back(&nI);
28370ca358b7d540b6061236ddf757085042873c12cChris Lattner
284d8d26b3268acf7f157028f0cb60a545b185e8905Alkis Evlogimenos            // update live variables if it is available
285d8d26b3268acf7f157028f0cb60a545b185e8905Alkis Evlogimenos            if (lv_)
2862926869b4a083fc951484de03a9867eabf81e880Chris Lattner              lv_->addVirtualRegisterKilled(NewVReg, MI);
287b11443dc8458b0ba72d484dacf99dffa2e8d3b51Chris Lattner
288bdc679d564e67a81792e463f6614b0088f975025Bill Wendling            DOUT << "\t\t\t\tadded new interval: ";
289bdc679d564e67a81792e463f6614b0088f975025Bill Wendling            nI.print(DOUT, mri_);
290bdc679d564e67a81792e463f6614b0088f975025Bill Wendling            DOUT << '\n';
2911a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos          }
292843b160a2040b3ec4d3452678450afa11704c473Alkis Evlogimenos        }
2931a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      }
294843b160a2040b3ec4d3452678450afa11704c473Alkis Evlogimenos    }
2951a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  }
29626f5a69e52b64e035d26c135979a39b39fd6ba3eAlkis Evlogimenos
2971a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  return added;
298843b160a2040b3ec4d3452678450afa11704c473Alkis Evlogimenos}
299843b160a2040b3ec4d3452678450afa11704c473Alkis Evlogimenos
300be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattnervoid LiveIntervals::printRegName(unsigned reg) const {
3011a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  if (MRegisterInfo::isPhysicalRegister(reg))
302e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling    cerr << mri_->getName(reg);
3031a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  else
304e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling    cerr << "%reg" << reg;
305ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos}
306ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
307bf105c842450d3308d024be203ddd533f37051ecEvan Cheng/// isReDefinedByTwoAddr - Returns true if the Reg re-definition is due to
308bf105c842450d3308d024be203ddd533f37051ecEvan Cheng/// two addr elimination.
309bf105c842450d3308d024be203ddd533f37051ecEvan Chengstatic bool isReDefinedByTwoAddr(MachineInstr *MI, unsigned Reg,
310bf105c842450d3308d024be203ddd533f37051ecEvan Cheng                                const TargetInstrInfo *TII) {
311bf105c842450d3308d024be203ddd533f37051ecEvan Cheng  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
312bf105c842450d3308d024be203ddd533f37051ecEvan Cheng    MachineOperand &MO1 = MI->getOperand(i);
313bf105c842450d3308d024be203ddd533f37051ecEvan Cheng    if (MO1.isRegister() && MO1.isDef() && MO1.getReg() == Reg) {
314bf105c842450d3308d024be203ddd533f37051ecEvan Cheng      for (unsigned j = i+1; j < e; ++j) {
315bf105c842450d3308d024be203ddd533f37051ecEvan Cheng        MachineOperand &MO2 = MI->getOperand(j);
316bf105c842450d3308d024be203ddd533f37051ecEvan Cheng        if (MO2.isRegister() && MO2.isUse() && MO2.getReg() == Reg &&
31751cdcd197268a7abf19b2698fc824e0da3d98049Evan Cheng            MI->getInstrDescriptor()->
31851cdcd197268a7abf19b2698fc824e0da3d98049Evan Cheng            getOperandConstraint(j, TOI::TIED_TO) == (int)i)
319bf105c842450d3308d024be203ddd533f37051ecEvan Cheng          return true;
320bf105c842450d3308d024be203ddd533f37051ecEvan Cheng      }
321bf105c842450d3308d024be203ddd533f37051ecEvan Cheng    }
322bf105c842450d3308d024be203ddd533f37051ecEvan Cheng  }
323bf105c842450d3308d024be203ddd533f37051ecEvan Cheng  return false;
324bf105c842450d3308d024be203ddd533f37051ecEvan Cheng}
325bf105c842450d3308d024be203ddd533f37051ecEvan Cheng
326be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattnervoid LiveIntervals::handleVirtualRegisterDef(MachineBasicBlock *mbb,
327ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos                                             MachineBasicBlock::iterator mi,
3286b128bdc58a496e9f08e4d09416330320761baffChris Lattner                                             unsigned MIIdx,
329be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner                                             LiveInterval &interval) {
330bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << "\t\tregister: "; DEBUG(printRegName(interval.reg));
3311a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  LiveVariables::VarInfo& vi = lv_->getVarInfo(interval.reg);
3321a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
333706515727c6d024015fffded2b3109a4f0ac5299Alkis Evlogimenos  // Virtual registers may be defined multiple times (due to phi
334706515727c6d024015fffded2b3109a4f0ac5299Alkis Evlogimenos  // elimination and 2-addr elimination).  Much of what we do only has to be
335706515727c6d024015fffded2b3109a4f0ac5299Alkis Evlogimenos  // done once for the vreg.  We use an empty interval to detect the first
3361a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // time we see a vreg.
3371a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  if (interval.empty()) {
3389193514e2e3e599e241220b72bc9add25a80a8fdEvan Cheng    // Remember if the definition can be rematerialized. All load's from fixed
33982a87a01723c095176c6940bcc63d3a7c8007b4bDan Gohman    // stack slots are re-materializable. The target may permit other
34082a87a01723c095176c6940bcc63d3a7c8007b4bDan Gohman    // instructions to be re-materialized as well.
3419193514e2e3e599e241220b72bc9add25a80a8fdEvan Cheng    int FrameIdx = 0;
3429193514e2e3e599e241220b72bc9add25a80a8fdEvan Cheng    if (vi.DefInst &&
34382a87a01723c095176c6940bcc63d3a7c8007b4bDan Gohman        (tii_->isTriviallyReMaterializable(vi.DefInst) ||
3449193514e2e3e599e241220b72bc9add25a80a8fdEvan Cheng         (tii_->isLoadFromStackSlot(vi.DefInst, FrameIdx) &&
34582a87a01723c095176c6940bcc63d3a7c8007b4bDan Gohman          mf_->getFrameInfo()->isFixedObjectIndex(FrameIdx))))
3462638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng      interval.remat = vi.DefInst;
3472638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng
3481a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // Get the Idx of the defining instructions.
3496b128bdc58a496e9f08e4d09416330320761baffChris Lattner    unsigned defIndex = getDefIndex(MIIdx);
35091725b75852443923b419fd23215194cfc65dd88Chris Lattner    unsigned ValNum;
35191725b75852443923b419fd23215194cfc65dd88Chris Lattner    unsigned SrcReg, DstReg;
35291725b75852443923b419fd23215194cfc65dd88Chris Lattner    if (!tii_->isMoveInstr(*mi, SrcReg, DstReg))
353a8d94f1315f722de056af03763664b77a5baac26Evan Cheng      ValNum = interval.getNextValue(defIndex, 0);
35491725b75852443923b419fd23215194cfc65dd88Chris Lattner    else
35591725b75852443923b419fd23215194cfc65dd88Chris Lattner      ValNum = interval.getNextValue(defIndex, SrcReg);
35691725b75852443923b419fd23215194cfc65dd88Chris Lattner
3571a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    assert(ValNum == 0 && "First value in interval is not 0?");
3581a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    ValNum = 0;  // Clue in the optimizer.
3591a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
3601a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // Loop over all of the blocks that the vreg is defined in.  There are
3611a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // two cases we have to handle here.  The most common case is a vreg
3621a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // whose lifetime is contained within a basic block.  In this case there
3631a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // will be a single kill, in MBB, which comes after the definition.
3641a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    if (vi.Kills.size() == 1 && vi.Kills[0]->getParent() == mbb) {
3651a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // FIXME: what about dead vars?
3661a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      unsigned killIdx;
3671a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      if (vi.Kills[0] != mi)
3681a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        killIdx = getUseIndex(getInstructionIndex(vi.Kills[0]))+1;
3691a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      else
3701a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        killIdx = defIndex+1;
3711a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
3721a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // If the kill happens after the definition, we have an intra-block
3731a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // live range.
3741a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      if (killIdx > defIndex) {
37561de82d8853a02fe39c47302432abb70a586704fEvan Cheng        assert(vi.AliveBlocks.none() &&
3761a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos               "Shouldn't be alive across any blocks!");
3771a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        LiveRange LR(defIndex, killIdx, ValNum);
3781a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        interval.addRange(LR);
379bdc679d564e67a81792e463f6614b0088f975025Bill Wendling        DOUT << " +" << LR << "\n";
3808df786012dc6b875f31ba4152e09c6e0098082eeEvan Cheng        interval.addKillForValNum(ValNum, killIdx);
3811a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        return;
3821a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      }
3831a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    }
3846097d13b2a624048dbe02e39e2dfb23bfa269b64Chris Lattner
3851a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // The other case we handle is when a virtual register lives to the end
3861a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // of the defining block, potentially live across some blocks, then is
3871a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // live into some number of blocks, but gets killed.  Start by adding a
3881a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // range that goes from this definition to the end of the defining block.
389d19e2901c1b79d287d01079659684f3a4951a69eAlkis Evlogimenos    LiveRange NewLR(defIndex,
390d19e2901c1b79d287d01079659684f3a4951a69eAlkis Evlogimenos                    getInstructionIndex(&mbb->back()) + InstrSlots::NUM,
391d19e2901c1b79d287d01079659684f3a4951a69eAlkis Evlogimenos                    ValNum);
392bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    DOUT << " +" << NewLR;
3931a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    interval.addRange(NewLR);
3941a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
3951a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // Iterate over all of the blocks that the variable is completely
3961a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // live in, adding [insrtIndex(begin), instrIndex(end)+4) to the
3971a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // live interval.
3981a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    for (unsigned i = 0, e = vi.AliveBlocks.size(); i != e; ++i) {
3991a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      if (vi.AliveBlocks[i]) {
400428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner        MachineBasicBlock *MBB = mf_->getBlockNumbered(i);
401428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner        if (!MBB->empty()) {
402428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner          LiveRange LR(getMBBStartIdx(i),
403428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner                       getInstructionIndex(&MBB->back()) + InstrSlots::NUM,
4041a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos                       ValNum);
4051a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos          interval.addRange(LR);
406bdc679d564e67a81792e463f6614b0088f975025Bill Wendling          DOUT << " +" << LR;
4071a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        }
4081a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      }
4091a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    }
4101a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
4111a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // Finally, this virtual register is live from the start of any killing
4121a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // block to the 'use' slot of the killing instruction.
4131a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    for (unsigned i = 0, e = vi.Kills.size(); i != e; ++i) {
4141a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      MachineInstr *Kill = vi.Kills[i];
4158df786012dc6b875f31ba4152e09c6e0098082eeEvan Cheng      unsigned killIdx = getUseIndex(getInstructionIndex(Kill))+1;
416428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner      LiveRange LR(getMBBStartIdx(Kill->getParent()),
4178df786012dc6b875f31ba4152e09c6e0098082eeEvan Cheng                   killIdx, ValNum);
4181a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      interval.addRange(LR);
4198df786012dc6b875f31ba4152e09c6e0098082eeEvan Cheng      interval.addKillForValNum(ValNum, killIdx);
420bdc679d564e67a81792e463f6614b0088f975025Bill Wendling      DOUT << " +" << LR;
4211a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    }
4221a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
4231a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  } else {
4249193514e2e3e599e241220b72bc9add25a80a8fdEvan Cheng    // Can no longer safely assume definition is rematerializable.
4252638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng    interval.remat = NULL;
4262638e1a6b9e3c0e22b398987e1db99bee81db4fbEvan Cheng
4271a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // If this is the second time we see a virtual register definition, it
4281a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // must be due to phi elimination or two addr elimination.  If this is
429bf105c842450d3308d024be203ddd533f37051ecEvan Cheng    // the result of two address elimination, then the vreg is one of the
430bf105c842450d3308d024be203ddd533f37051ecEvan Cheng    // def-and-use register operand.
431bf105c842450d3308d024be203ddd533f37051ecEvan Cheng    if (isReDefinedByTwoAddr(mi, interval.reg, tii_)) {
4321a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // If this is a two-address definition, then we have already processed
4331a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // the live range.  The only problem is that we didn't realize there
4341a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // are actually two values in the live interval.  Because of this we
4351a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // need to take the LiveRegion that defines this register and split it
4361a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // into two values.
4371a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      unsigned DefIndex = getDefIndex(getInstructionIndex(vi.DefInst));
4386b128bdc58a496e9f08e4d09416330320761baffChris Lattner      unsigned RedefIndex = getDefIndex(MIIdx);
4391a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
4404f8ff168de12eabdeb4b9437bf9402489ecf85cbEvan Cheng      const LiveRange *OldLR = interval.getLiveRangeContaining(RedefIndex-1);
4414f8ff168de12eabdeb4b9437bf9402489ecf85cbEvan Cheng      unsigned OldEnd = OldLR->end;
4424f8ff168de12eabdeb4b9437bf9402489ecf85cbEvan Cheng
4431a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // Delete the initial value, which should be short and continuous,
444be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner      // because the 2-addr copy must be in the same MBB as the redef.
4451a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      interval.removeRange(DefIndex, RedefIndex);
446706515727c6d024015fffded2b3109a4f0ac5299Alkis Evlogimenos
447be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner      // Two-address vregs should always only be redefined once.  This means
448be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner      // that at this point, there should be exactly one value number in it.
449be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner      assert(interval.containsOneValue() && "Unexpected 2-addr liveint!");
450be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner
45191725b75852443923b419fd23215194cfc65dd88Chris Lattner      // The new value number (#1) is defined by the instruction we claimed
45291725b75852443923b419fd23215194cfc65dd88Chris Lattner      // defined value #0.
45391725b75852443923b419fd23215194cfc65dd88Chris Lattner      unsigned ValNo = interval.getNextValue(0, 0);
4544f8ff168de12eabdeb4b9437bf9402489ecf85cbEvan Cheng      interval.copyValNumInfo(ValNo, 0);
455be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner
45691725b75852443923b419fd23215194cfc65dd88Chris Lattner      // Value#0 is now defined by the 2-addr instruction.
4574f8ff168de12eabdeb4b9437bf9402489ecf85cbEvan Cheng      interval.setDefForValNum(0, RedefIndex);
4584f8ff168de12eabdeb4b9437bf9402489ecf85cbEvan Cheng      interval.setSrcRegForValNum(0, 0);
459be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner
460be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner      // Add the new live interval which replaces the range for the input copy.
461be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner      LiveRange LR(DefIndex, RedefIndex, ValNo);
462bdc679d564e67a81792e463f6614b0088f975025Bill Wendling      DOUT << " replace range with " << LR;
4631a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      interval.addRange(LR);
46424c2e5cf7e926452ea5875d027ec0d24d9c19e39Evan Cheng      interval.addKillForValNum(ValNo, RedefIndex);
4654f8ff168de12eabdeb4b9437bf9402489ecf85cbEvan Cheng      interval.removeKillForValNum(ValNo, RedefIndex, OldEnd);
4661a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
4671a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // If this redefinition is dead, we need to add a dummy unit live
4681a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // range covering the def slot.
469ab4b66d4c279e8cd9e448687020fc838e7881dbcChris Lattner      if (lv_->RegisterDefIsDead(mi, interval.reg))
470ab4b66d4c279e8cd9e448687020fc838e7881dbcChris Lattner        interval.addRange(LiveRange(RedefIndex, RedefIndex+1, 0));
4711a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
47256fdd7af884a35673fb6dd3e01333960922c3ac2Evan Cheng      DOUT << " RESULT: ";
473bdc679d564e67a81792e463f6614b0088f975025Bill Wendling      interval.print(DOUT, mri_);
4741a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
4751a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    } else {
4761a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // Otherwise, this must be because of phi elimination.  If this is the
4771a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // first redefinition of the vreg that we have seen, go back and change
4781a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // the live range in the PHI block to be a different value number.
4791a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      if (interval.containsOneValue()) {
4801a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        assert(vi.Kills.size() == 1 &&
4811a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos               "PHI elimination vreg should have one kill, the PHI itself!");
4821a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
4831a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        // Remove the old range that we now know has an incorrect number.
4841a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        MachineInstr *Killer = vi.Kills[0];
485428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner        unsigned Start = getMBBStartIdx(Killer->getParent());
4861a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        unsigned End = getUseIndex(getInstructionIndex(Killer))+1;
48756fdd7af884a35673fb6dd3e01333960922c3ac2Evan Cheng        DOUT << " Removing [" << Start << "," << End << "] from: ";
488bdc679d564e67a81792e463f6614b0088f975025Bill Wendling        interval.print(DOUT, mri_); DOUT << "\n";
4891a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        interval.removeRange(Start, End);
4904f8ff168de12eabdeb4b9437bf9402489ecf85cbEvan Cheng        interval.addKillForValNum(0, Start);
49156fdd7af884a35673fb6dd3e01333960922c3ac2Evan Cheng        DOUT << " RESULT: "; interval.print(DOUT, mri_);
4921a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
493be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner        // Replace the interval with one of a NEW value number.  Note that this
494be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner        // value number isn't actually defined by an instruction, weird huh? :)
495a8d94f1315f722de056af03763664b77a5baac26Evan Cheng        LiveRange LR(Start, End, interval.getNextValue(~0, 0));
496bdc679d564e67a81792e463f6614b0088f975025Bill Wendling        DOUT << " replace range with " << LR;
4971a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        interval.addRange(LR);
49824c2e5cf7e926452ea5875d027ec0d24d9c19e39Evan Cheng        interval.addKillForValNum(LR.ValId, End);
49956fdd7af884a35673fb6dd3e01333960922c3ac2Evan Cheng        DOUT << " RESULT: "; interval.print(DOUT, mri_);
5001a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      }
5011a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
5021a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // In the case of PHI elimination, each variable definition is only
5031a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // live until the end of the block.  We've already taken care of the
5041a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // rest of the live range.
5056b128bdc58a496e9f08e4d09416330320761baffChris Lattner      unsigned defIndex = getDefIndex(MIIdx);
50691725b75852443923b419fd23215194cfc65dd88Chris Lattner
50791725b75852443923b419fd23215194cfc65dd88Chris Lattner      unsigned ValNum;
50891725b75852443923b419fd23215194cfc65dd88Chris Lattner      unsigned SrcReg, DstReg;
50991725b75852443923b419fd23215194cfc65dd88Chris Lattner      if (!tii_->isMoveInstr(*mi, SrcReg, DstReg))
510a8d94f1315f722de056af03763664b77a5baac26Evan Cheng        ValNum = interval.getNextValue(defIndex, 0);
51191725b75852443923b419fd23215194cfc65dd88Chris Lattner      else
51291725b75852443923b419fd23215194cfc65dd88Chris Lattner        ValNum = interval.getNextValue(defIndex, SrcReg);
51391725b75852443923b419fd23215194cfc65dd88Chris Lattner
51424c2e5cf7e926452ea5875d027ec0d24d9c19e39Evan Cheng      unsigned killIndex = getInstructionIndex(&mbb->back()) + InstrSlots::NUM;
51524c2e5cf7e926452ea5875d027ec0d24d9c19e39Evan Cheng      LiveRange LR(defIndex, killIndex, ValNum);
5161a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      interval.addRange(LR);
51724c2e5cf7e926452ea5875d027ec0d24d9c19e39Evan Cheng      interval.addKillForValNum(ValNum, killIndex);
518bdc679d564e67a81792e463f6614b0088f975025Bill Wendling      DOUT << " +" << LR;
519dd2cc65f34f9b7bfda1cd0c42becedfc361d46f8Alkis Evlogimenos    }
5201a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  }
521ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
522bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << '\n';
523ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos}
524ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
525f35fef7060c465dd7b578bf6339a18e8a8911888Chris Lattnervoid LiveIntervals::handlePhysicalRegisterDef(MachineBasicBlock *MBB,
526ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos                                              MachineBasicBlock::iterator mi,
5276b128bdc58a496e9f08e4d09416330320761baffChris Lattner                                              unsigned MIIdx,
52891725b75852443923b419fd23215194cfc65dd88Chris Lattner                                              LiveInterval &interval,
52991725b75852443923b419fd23215194cfc65dd88Chris Lattner                                              unsigned SrcReg) {
5301a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // A physical register cannot be live across basic block, so its
5311a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // lifetime must end somewhere in its defining basic block.
532bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << "\t\tregister: "; DEBUG(printRegName(interval.reg));
5331a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
5346b128bdc58a496e9f08e4d09416330320761baffChris Lattner  unsigned baseIndex = MIIdx;
5351a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  unsigned start = getDefIndex(baseIndex);
5361a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  unsigned end = start;
5371a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
5381a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // If it is not used after definition, it is considered dead at
5391a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // the instruction defining it. Hence its interval is:
5401a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // [defSlot(def), defSlot(def)+1)
541ab4b66d4c279e8cd9e448687020fc838e7881dbcChris Lattner  if (lv_->RegisterDefIsDead(mi, interval.reg)) {
542bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    DOUT << " dead";
543ab4b66d4c279e8cd9e448687020fc838e7881dbcChris Lattner    end = getDefIndex(start) + 1;
544ab4b66d4c279e8cd9e448687020fc838e7881dbcChris Lattner    goto exit;
5451a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  }
546ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
5471a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // If it is not dead on definition, it must be killed by a
5481a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // subsequent instruction. Hence its interval is:
5491a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // [defSlot(def), useSlot(kill)+1)
5505ab6f5fe666d0e3403d9b777324d1a1999118153Chris Lattner  while (++mi != MBB->end()) {
5511a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    baseIndex += InstrSlots::NUM;
552ab4b66d4c279e8cd9e448687020fc838e7881dbcChris Lattner    if (lv_->KillsRegister(mi, interval.reg)) {
553bdc679d564e67a81792e463f6614b0088f975025Bill Wendling      DOUT << " killed";
554ab4b66d4c279e8cd9e448687020fc838e7881dbcChris Lattner      end = getUseIndex(baseIndex) + 1;
555ab4b66d4c279e8cd9e448687020fc838e7881dbcChris Lattner      goto exit;
5569a1956ae6ad2d4892afbc9f1b97d645d220b6d4aEvan Cheng    } else if (lv_->ModifiesRegister(mi, interval.reg)) {
5579a1956ae6ad2d4892afbc9f1b97d645d220b6d4aEvan Cheng      // Another instruction redefines the register before it is ever read.
5589a1956ae6ad2d4892afbc9f1b97d645d220b6d4aEvan Cheng      // Then the register is essentially dead at the instruction that defines
5599a1956ae6ad2d4892afbc9f1b97d645d220b6d4aEvan Cheng      // it. Hence its interval is:
5609a1956ae6ad2d4892afbc9f1b97d645d220b6d4aEvan Cheng      // [defSlot(def), defSlot(def)+1)
561bdc679d564e67a81792e463f6614b0088f975025Bill Wendling      DOUT << " dead";
5629a1956ae6ad2d4892afbc9f1b97d645d220b6d4aEvan Cheng      end = getDefIndex(start) + 1;
5639a1956ae6ad2d4892afbc9f1b97d645d220b6d4aEvan Cheng      goto exit;
564f35fef7060c465dd7b578bf6339a18e8a8911888Chris Lattner    }
5651a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  }
5665ab6f5fe666d0e3403d9b777324d1a1999118153Chris Lattner
5675ab6f5fe666d0e3403d9b777324d1a1999118153Chris Lattner  // The only case we should have a dead physreg here without a killing or
5685ab6f5fe666d0e3403d9b777324d1a1999118153Chris Lattner  // instruction where we know it's dead is if it is live-in to the function
5695ab6f5fe666d0e3403d9b777324d1a1999118153Chris Lattner  // and never used.
57091725b75852443923b419fd23215194cfc65dd88Chris Lattner  assert(!SrcReg && "physreg was not killed in defining block!");
5715ab6f5fe666d0e3403d9b777324d1a1999118153Chris Lattner  end = getDefIndex(start) + 1;  // It's dead.
57202ba13c9897ae2b19f9201e57460d7ee2b753a0bAlkis Evlogimenos
573ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenosexit:
5741a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  assert(start < end && "did not find end of interval?");
575f768bba43f5c036039851d2fcca8212edca18467Chris Lattner
57624a3cc4c83e5edb25fadf7b8979a26b4451795c6Evan Cheng  // Already exists? Extend old live interval.
57724a3cc4c83e5edb25fadf7b8979a26b4451795c6Evan Cheng  LiveInterval::iterator OldLR = interval.FindLiveRangeContaining(start);
57824a3cc4c83e5edb25fadf7b8979a26b4451795c6Evan Cheng  unsigned Id = (OldLR != interval.end())
579a8d94f1315f722de056af03763664b77a5baac26Evan Cheng    ? OldLR->ValId : interval.getNextValue(start, SrcReg);
58024a3cc4c83e5edb25fadf7b8979a26b4451795c6Evan Cheng  LiveRange LR(start, end, Id);
5811a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  interval.addRange(LR);
58224c2e5cf7e926452ea5875d027ec0d24d9c19e39Evan Cheng  interval.addKillForValNum(LR.ValId, end);
583bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << " +" << LR << '\n';
584ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos}
585ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
586f35fef7060c465dd7b578bf6339a18e8a8911888Chris Lattnervoid LiveIntervals::handleRegisterDef(MachineBasicBlock *MBB,
587f35fef7060c465dd7b578bf6339a18e8a8911888Chris Lattner                                      MachineBasicBlock::iterator MI,
5886b128bdc58a496e9f08e4d09416330320761baffChris Lattner                                      unsigned MIIdx,
589f35fef7060c465dd7b578bf6339a18e8a8911888Chris Lattner                                      unsigned reg) {
590f35fef7060c465dd7b578bf6339a18e8a8911888Chris Lattner  if (MRegisterInfo::isVirtualRegister(reg))
5916b128bdc58a496e9f08e4d09416330320761baffChris Lattner    handleVirtualRegisterDef(MBB, MI, MIIdx, getOrCreateInterval(reg));
5925327801fb87e3eda52a33f82e6211181030ecb93Alkis Evlogimenos  else if (allocatableRegs_[reg]) {
59391725b75852443923b419fd23215194cfc65dd88Chris Lattner    unsigned SrcReg, DstReg;
59491725b75852443923b419fd23215194cfc65dd88Chris Lattner    if (!tii_->isMoveInstr(*MI, SrcReg, DstReg))
59591725b75852443923b419fd23215194cfc65dd88Chris Lattner      SrcReg = 0;
5966b128bdc58a496e9f08e4d09416330320761baffChris Lattner    handlePhysicalRegisterDef(MBB, MI, MIIdx, getOrCreateInterval(reg), SrcReg);
59724a3cc4c83e5edb25fadf7b8979a26b4451795c6Evan Cheng    // Def of a register also defines its sub-registers.
59824a3cc4c83e5edb25fadf7b8979a26b4451795c6Evan Cheng    for (const unsigned* AS = mri_->getSubRegisters(reg); *AS; ++AS)
59924a3cc4c83e5edb25fadf7b8979a26b4451795c6Evan Cheng      // Avoid processing some defs more than once.
60024a3cc4c83e5edb25fadf7b8979a26b4451795c6Evan Cheng      if (!MI->findRegisterDefOperand(*AS))
60124a3cc4c83e5edb25fadf7b8979a26b4451795c6Evan Cheng        handlePhysicalRegisterDef(MBB, MI, MIIdx, getOrCreateInterval(*AS), 0);
602f35fef7060c465dd7b578bf6339a18e8a8911888Chris Lattner  }
6034d46e1e521c0df1990ea50f8146d22bd77ea71a6Alkis Evlogimenos}
6044d46e1e521c0df1990ea50f8146d22bd77ea71a6Alkis Evlogimenos
605b371f457b0ea4a652a9f526ba4375c80ae542252Evan Chengvoid LiveIntervals::handleLiveInRegister(MachineBasicBlock *MBB,
6069b25b8ca24d6df2e097741dcc15016772ee4eda7Jim Laskey                                         unsigned MIIdx,
60724a3cc4c83e5edb25fadf7b8979a26b4451795c6Evan Cheng                                         LiveInterval &interval, bool isAlias) {
608b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  DOUT << "\t\tlivein register: "; DEBUG(printRegName(interval.reg));
609b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
610b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  // Look for kills, if it reaches a def before it's killed, then it shouldn't
611b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  // be considered a livein.
612b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  MachineBasicBlock::iterator mi = MBB->begin();
6139b25b8ca24d6df2e097741dcc15016772ee4eda7Jim Laskey  unsigned baseIndex = MIIdx;
6149b25b8ca24d6df2e097741dcc15016772ee4eda7Jim Laskey  unsigned start = baseIndex;
615b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  unsigned end = start;
616b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  while (mi != MBB->end()) {
617b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    if (lv_->KillsRegister(mi, interval.reg)) {
618b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      DOUT << " killed";
619b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      end = getUseIndex(baseIndex) + 1;
620b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      goto exit;
621b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    } else if (lv_->ModifiesRegister(mi, interval.reg)) {
622b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      // Another instruction redefines the register before it is ever read.
623b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      // Then the register is essentially dead at the instruction that defines
624b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      // it. Hence its interval is:
625b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      // [defSlot(def), defSlot(def)+1)
626b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      DOUT << " dead";
627b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      end = getDefIndex(start) + 1;
628b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      goto exit;
629b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    }
630b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
631b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    baseIndex += InstrSlots::NUM;
632b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    ++mi;
633b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  }
634b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
635b371f457b0ea4a652a9f526ba4375c80ae542252Evan Chengexit:
63675611fb4e6ab253be30ac29a2b15e9bf8c1d146eEvan Cheng  // Live-in register might not be used at all.
63775611fb4e6ab253be30ac29a2b15e9bf8c1d146eEvan Cheng  if (end == MIIdx) {
638292da949f6c87d6499425d64d37d7c5870ec57adEvan Cheng    if (isAlias) {
639292da949f6c87d6499425d64d37d7c5870ec57adEvan Cheng      DOUT << " dead";
64075611fb4e6ab253be30ac29a2b15e9bf8c1d146eEvan Cheng      end = getDefIndex(MIIdx) + 1;
641292da949f6c87d6499425d64d37d7c5870ec57adEvan Cheng    } else {
642292da949f6c87d6499425d64d37d7c5870ec57adEvan Cheng      DOUT << " live through";
643292da949f6c87d6499425d64d37d7c5870ec57adEvan Cheng      end = baseIndex;
644292da949f6c87d6499425d64d37d7c5870ec57adEvan Cheng    }
64524a3cc4c83e5edb25fadf7b8979a26b4451795c6Evan Cheng  }
64624a3cc4c83e5edb25fadf7b8979a26b4451795c6Evan Cheng
647a8d94f1315f722de056af03763664b77a5baac26Evan Cheng  LiveRange LR(start, end, interval.getNextValue(start, 0));
6489b25b8ca24d6df2e097741dcc15016772ee4eda7Jim Laskey  interval.addRange(LR);
64924c2e5cf7e926452ea5875d027ec0d24d9c19e39Evan Cheng  interval.addKillForValNum(LR.ValId, end);
65024c2e5cf7e926452ea5875d027ec0d24d9c19e39Evan Cheng  DOUT << " +" << LR << '\n';
651b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng}
652b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
653ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos/// computeIntervals - computes the live intervals for virtual
6544d46e1e521c0df1990ea50f8146d22bd77ea71a6Alkis Evlogimenos/// registers. for some ordering of the machine instructions [1,N] a
65508cec00588ec1a8fa85b208555f006d7396ae7a4Alkis Evlogimenos/// live interval is an interval [i, j) where 1 <= i <= j < N for
656ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos/// which a variable is live
657f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattnervoid LiveIntervals::computeIntervals() {
658bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << "********** COMPUTING LIVE INTERVALS **********\n"
659bdc679d564e67a81792e463f6614b0088f975025Bill Wendling       << "********** Function: "
660bdc679d564e67a81792e463f6614b0088f975025Bill Wendling       << ((Value*)mf_->getFunction())->getName() << '\n';
6616b128bdc58a496e9f08e4d09416330320761baffChris Lattner  // Track the index of the current machine instr.
6626b128bdc58a496e9f08e4d09416330320761baffChris Lattner  unsigned MIIndex = 0;
663428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner  for (MachineFunction::iterator MBBI = mf_->begin(), E = mf_->end();
664428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner       MBBI != E; ++MBBI) {
665428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner    MachineBasicBlock *MBB = MBBI;
666bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    DOUT << ((Value*)MBB->getBasicBlock())->getName() << ":\n";
6671a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
668428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner    MachineBasicBlock::iterator MI = MBB->begin(), miEnd = MBB->end();
6690c9f92e1ff64ee56724eae444a0442b02f83d0a8Evan Cheng
6700c9f92e1ff64ee56724eae444a0442b02f83d0a8Evan Cheng    if (MBB->livein_begin() != MBB->livein_end()) {
671b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      // Create intervals for live-ins to this BB first.
672b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      for (MachineBasicBlock::const_livein_iterator LI = MBB->livein_begin(),
6730c9f92e1ff64ee56724eae444a0442b02f83d0a8Evan Cheng             LE = MBB->livein_end(); LI != LE; ++LI) {
6749b25b8ca24d6df2e097741dcc15016772ee4eda7Jim Laskey        handleLiveInRegister(MBB, MIIndex, getOrCreateInterval(*LI));
67524a3cc4c83e5edb25fadf7b8979a26b4451795c6Evan Cheng        // Multiple live-ins can alias the same register.
67624a3cc4c83e5edb25fadf7b8979a26b4451795c6Evan Cheng        for (const unsigned* AS = mri_->getSubRegisters(*LI); *AS; ++AS)
67724a3cc4c83e5edb25fadf7b8979a26b4451795c6Evan Cheng          if (!hasInterval(*AS))
678292da949f6c87d6499425d64d37d7c5870ec57adEvan Cheng            handleLiveInRegister(MBB, MIIndex, getOrCreateInterval(*AS),
679292da949f6c87d6499425d64d37d7c5870ec57adEvan Cheng                                 true);
6800c9f92e1ff64ee56724eae444a0442b02f83d0a8Evan Cheng      }
681dffb2e83ed2546226d09c40aa43524e2392322daChris Lattner    }
682dffb2e83ed2546226d09c40aa43524e2392322daChris Lattner
683428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner    for (; MI != miEnd; ++MI) {
684bdc679d564e67a81792e463f6614b0088f975025Bill Wendling      DOUT << MIIndex << "\t" << *MI;
6851a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
686438f7bc67cf235ccee7e6f7ac7f4ae2186eb8020Evan Cheng      // Handle defs.
687428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner      for (int i = MI->getNumOperands() - 1; i >= 0; --i) {
688428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner        MachineOperand &MO = MI->getOperand(i);
6891a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        // handle register defs - build intervals
690428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner        if (MO.isRegister() && MO.getReg() && MO.isDef())
691428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner          handleRegisterDef(MBB, MI, MIIndex, MO.getReg());
6921a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      }
6936b128bdc58a496e9f08e4d09416330320761baffChris Lattner
6946b128bdc58a496e9f08e4d09416330320761baffChris Lattner      MIIndex += InstrSlots::NUM;
695ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos    }
6961a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  }
697ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos}
698b27ef248f579b354aab434f63c417ab1103e47e2Alkis Evlogimenos
699a1613db62fec94845aa8306232fb665273615badAlkis EvlogimenosLiveInterval LiveIntervals::createInterval(unsigned reg) {
700edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman  float Weight = MRegisterInfo::isPhysicalRegister(reg) ?
7017902c75331fa8f38fc8380f5573d935c0d149ef5Jim Laskey                       HUGE_VALF : 0.0F;
702a1613db62fec94845aa8306232fb665273615badAlkis Evlogimenos  return LiveInterval(reg, Weight);
7039a8b490735d216435862a3d52e669357f165550fAlkis Evlogimenos}
704