LiveIntervalAnalysis.cpp revision b9890ae3c35ad7d8e49261650d5b98f49f97a705
1a3b8b5c0e0a1d0942288568b2012592184ca67c5Chris Lattner//===-- LiveIntervalAnalysis.cpp - Live Interval Analysis -----------------===//
2ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos//
3ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos//                     The LLVM Compiler Infrastructure
4ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// 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"
22ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos#include "llvm/CodeGen/LiveVariables.h"
23ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos#include "llvm/CodeGen/MachineFrameInfo.h"
24ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos#include "llvm/CodeGen/MachineInstr.h"
2522f07ffd27d1d721634d502c37267721d2e025cfEvan Cheng#include "llvm/CodeGen/MachineLoopInfo.h"
2684bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner#include "llvm/CodeGen/MachineRegisterInfo.h"
27ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos#include "llvm/CodeGen/Passes.h"
286f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman#include "llvm/Target/TargetRegisterInfo.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
39844731a7f1909f55935e3514c9e713a62d67662eDan Gohman// Hidden options for help debugging.
40844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanstatic cl::opt<bool> DisableReMat("disable-rematerialization",
41844731a7f1909f55935e3514c9e713a62d67662eDan Gohman                                  cl::init(false), cl::Hidden);
42844731a7f1909f55935e3514c9e713a62d67662eDan Gohman
43844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanstatic cl::opt<bool> SplitAtBB("split-intervals-at-bb",
44844731a7f1909f55935e3514c9e713a62d67662eDan Gohman                               cl::init(true), cl::Hidden);
45844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanstatic cl::opt<int> SplitLimit("split-limit",
46844731a7f1909f55935e3514c9e713a62d67662eDan Gohman                               cl::init(-1), cl::Hidden);
47bc165e436beb02443abea9736c1b77e2dd7828b6Evan Cheng
48cd3245ac45c595da96bb768a55cddc356dff55feChris LattnerSTATISTIC(numIntervals, "Number of original intervals");
49cd3245ac45c595da96bb768a55cddc356dff55feChris LattnerSTATISTIC(numIntervalsAfter, "Number of intervals after coalescing");
500cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan ChengSTATISTIC(numFolds    , "Number of loads/stores folded into instructions");
510cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan ChengSTATISTIC(numSplits   , "Number of intervals split");
52cd3245ac45c595da96bb768a55cddc356dff55feChris Lattner
531997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patelchar LiveIntervals::ID = 0;
54844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanstatic RegisterPass<LiveIntervals> X("liveintervals", "Live Interval Analysis");
55ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
56f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattnervoid LiveIntervals::getAnalysisUsage(AnalysisUsage &AU) const {
572513330de8f8020d15d5bc96640a0957b7c733b9David Greene  AU.addPreserved<LiveVariables>();
581a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  AU.addRequired<LiveVariables>();
5967d65bb69d5cad957cbb6d672dc0b4a19c211a42Bill Wendling  AU.addPreservedID(MachineLoopInfoID);
6067d65bb69d5cad957cbb6d672dc0b4a19c211a42Bill Wendling  AU.addPreservedID(MachineDominatorsID);
61fcc6350ac9b99d6590f5256d26bfa489b4531fb3Owen Anderson  AU.addPreservedID(PHIEliminationID);
62fcc6350ac9b99d6590f5256d26bfa489b4531fb3Owen Anderson  AU.addRequiredID(PHIEliminationID);
631a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  AU.addRequiredID(TwoAddressInstructionPassID);
641a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  MachineFunctionPass::getAnalysisUsage(AU);
65ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos}
66ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
67f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattnervoid LiveIntervals::releaseMemory() {
683f32d65912b4da23793dab618d981be2ce11c331Evan Cheng  MBB2IdxMap.clear();
694ca980e7f9ce7b78955307c2d07001a24d3b6befEvan Cheng  Idx2MBBMap.clear();
701a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  mi2iMap_.clear();
711a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  i2miMap_.clear();
721a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  r2iMap_.clear();
73dd199d29b781bc713462f1255b63d3f153bfd9e9Evan Cheng  // Release VNInfo memroy regions after all VNInfo objects are dtor'd.
74dd199d29b781bc713462f1255b63d3f153bfd9e9Evan Cheng  VNInfoAllocator.Reset();
75549f27d3070195d6647b796841a5291b4549e8e0Evan Cheng  for (unsigned i = 0, e = ClonedMIs.size(); i != e; ++i)
768e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman    mf_->DeleteMachineInstr(ClonedMIs[i]);
77993141402f57b4d4cbb7f8a3113f19c61688f9b7Evan Cheng}
78993141402f57b4d4cbb7f8a3113f19c61688f9b7Evan Cheng
7980b3ce65e294a28b88c882d44a5e749a2924c9e3Owen Andersonvoid LiveIntervals::computeNumbering() {
8080b3ce65e294a28b88c882d44a5e749a2924c9e3Owen Anderson  Index2MiMap OldI2MI = i2miMap_;
8180b3ce65e294a28b88c882d44a5e749a2924c9e3Owen Anderson
8280b3ce65e294a28b88c882d44a5e749a2924c9e3Owen Anderson  Idx2MBBMap.clear();
8380b3ce65e294a28b88c882d44a5e749a2924c9e3Owen Anderson  MBB2IdxMap.clear();
8480b3ce65e294a28b88c882d44a5e749a2924c9e3Owen Anderson  mi2iMap_.clear();
8580b3ce65e294a28b88c882d44a5e749a2924c9e3Owen Anderson  i2miMap_.clear();
8680b3ce65e294a28b88c882d44a5e749a2924c9e3Owen Anderson
87428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner  // Number MachineInstrs and MachineBasicBlocks.
88428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner  // Initialize MBB indexes to a sentinal.
89549f27d3070195d6647b796841a5291b4549e8e0Evan Cheng  MBB2IdxMap.resize(mf_->getNumBlockIDs(), std::make_pair(~0U,~0U));
90428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner
91428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner  unsigned MIIndex = 0;
92428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner  for (MachineFunction::iterator MBB = mf_->begin(), E = mf_->end();
93428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner       MBB != E; ++MBB) {
94549f27d3070195d6647b796841a5291b4549e8e0Evan Cheng    unsigned StartIdx = MIIndex;
950c9f92e1ff64ee56724eae444a0442b02f83d0a8Evan Cheng
96428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner    for (MachineBasicBlock::iterator I = MBB->begin(), E = MBB->end();
97428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner         I != E; ++I) {
98428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner      bool inserted = mi2iMap_.insert(std::make_pair(I, MIIndex)).second;
991a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      assert(inserted && "multiple MachineInstr -> index mappings");
100428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner      i2miMap_.push_back(I);
101428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner      MIIndex += InstrSlots::NUM;
10229b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson    }
10329b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson
10429b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson    if (StartIdx == MIIndex) {
10529b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson      // Empty MBB
1061fbb4545d41e65191ae66a7302276fa5424518c5Owen Anderson      MIIndex += InstrSlots::NUM;
1071fbb4545d41e65191ae66a7302276fa5424518c5Owen Anderson      i2miMap_.push_back(0);
108355780128986e375c7ac2a75025ac129bb8280bfOwen Anderson    }
1091fbb4545d41e65191ae66a7302276fa5424518c5Owen Anderson    // Set the MBB2IdxMap entry for this MBB.
1101fbb4545d41e65191ae66a7302276fa5424518c5Owen Anderson    MBB2IdxMap[MBB->getNumber()] = std::make_pair(StartIdx, MIIndex - 1);
1111fbb4545d41e65191ae66a7302276fa5424518c5Owen Anderson    Idx2MBBMap.push_back(std::make_pair(StartIdx, MBB));
112428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner  }
1134ca980e7f9ce7b78955307c2d07001a24d3b6befEvan Cheng  std::sort(Idx2MBBMap.begin(), Idx2MBBMap.end(), Idx2MBBCompare());
11480b3ce65e294a28b88c882d44a5e749a2924c9e3Owen Anderson
11580b3ce65e294a28b88c882d44a5e749a2924c9e3Owen Anderson  if (!OldI2MI.empty())
11629b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson    for (iterator I = begin(), E = end(); I != E; ++I)
11729b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson      for (LiveInterval::iterator LI = I->second.begin(), LE = I->second.end();
11829b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson           LI != LE; ++LI) {
1197eec0c243320fb2629554681547d7384ea9d0c53Owen Anderson
1207eec0c243320fb2629554681547d7384ea9d0c53Owen Anderson        // Remap the start index of the live range to the corresponding new
1217eec0c243320fb2629554681547d7384ea9d0c53Owen Anderson        // number, or our best guess at what it _should_ correspond to if the
1227eec0c243320fb2629554681547d7384ea9d0c53Owen Anderson        // original instruction has been erased.  This is either the following
1237eec0c243320fb2629554681547d7384ea9d0c53Owen Anderson        // instruction or its predecessor.
1244b5b209679f866d3ac6372f963aa7e9906f9a08bOwen Anderson        unsigned offset = LI->start % InstrSlots::NUM;
12529b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson        if (OldI2MI[LI->start / InstrSlots::NUM])
12629b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson          LI->start = mi2iMap_[OldI2MI[LI->start / InstrSlots::NUM]] + offset;
12729b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson        else {
12829b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson          unsigned i = 0;
12929b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson          MachineInstr* newInstr = 0;
13029b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson          do {
13129b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson            newInstr = OldI2MI[LI->start / InstrSlots::NUM + i];
13229b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson            i++;
13329b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson          } while (!newInstr);
1347eec0c243320fb2629554681547d7384ea9d0c53Owen Anderson
13529b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson          if (mi2iMap_[newInstr] ==
13629b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson              MBB2IdxMap[newInstr->getParent()->getNumber()].first)
13729b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson            LI->start = mi2iMap_[newInstr];
13829b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson          else
13929b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson            LI->start = mi2iMap_[newInstr] - InstrSlots::NUM + offset;
1407eec0c243320fb2629554681547d7384ea9d0c53Owen Anderson        }
1414b5b209679f866d3ac6372f963aa7e9906f9a08bOwen Anderson
1427eec0c243320fb2629554681547d7384ea9d0c53Owen Anderson        // Remap the ending index in the same way that we remapped the start,
1437eec0c243320fb2629554681547d7384ea9d0c53Owen Anderson        // except for the final step where we always map to the immediately
1447eec0c243320fb2629554681547d7384ea9d0c53Owen Anderson        // following instruction.
14529b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson        if (LI->end / InstrSlots::NUM < OldI2MI.size()) {
14629b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson          offset = LI->end % InstrSlots::NUM;
14729b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson          if (OldI2MI[LI->end / InstrSlots::NUM])
14829b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson            LI->end = mi2iMap_[OldI2MI[LI->end / InstrSlots::NUM]] + offset;
14929b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson          else {
15029b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson            unsigned i = 0;
15129b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson            MachineInstr* newInstr = 0;
15229b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson            do {
15329b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson              newInstr = OldI2MI[LI->end / InstrSlots::NUM + i];
15429b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson              i++;
15529b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson            } while (!newInstr);
15629b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson
15729b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson            LI->end = mi2iMap_[newInstr];
15829b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson          }
1594b5b209679f866d3ac6372f963aa7e9906f9a08bOwen Anderson        } else {
16029b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson          LI->end = i2miMap_.size() * InstrSlots::NUM;
1614b5b209679f866d3ac6372f963aa7e9906f9a08bOwen Anderson        }
162745825f431920662e97bdab5c1bcfac62e48c52fOwen Anderson
1637eec0c243320fb2629554681547d7384ea9d0c53Owen Anderson        // Remap the VNInfo def index, which works the same as the
1647eec0c243320fb2629554681547d7384ea9d0c53Owen Anderson        // start indices above.
165745825f431920662e97bdab5c1bcfac62e48c52fOwen Anderson        VNInfo* vni = LI->valno;
1664b5b209679f866d3ac6372f963aa7e9906f9a08bOwen Anderson        offset = vni->def % InstrSlots::NUM;
16729b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson        if (OldI2MI[vni->def / InstrSlots::NUM])
16829b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson          vni->def = mi2iMap_[OldI2MI[vni->def / InstrSlots::NUM]] + offset;
16929b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson        else {
17029b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson          unsigned i = 0;
17129b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson          MachineInstr* newInstr = 0;
17229b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson          do {
17329b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson            newInstr = OldI2MI[vni->def / InstrSlots::NUM + i];
17429b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson            i++;
17529b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson          } while (!newInstr);
1767eec0c243320fb2629554681547d7384ea9d0c53Owen Anderson
17729b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson          if (mi2iMap_[newInstr] ==
17829b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson              MBB2IdxMap[newInstr->getParent()->getNumber()].first)
17929b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson            vni->def = mi2iMap_[newInstr];
18029b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson          else
18129b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson            vni->def = mi2iMap_[newInstr] - InstrSlots::NUM + offset;
1827eec0c243320fb2629554681547d7384ea9d0c53Owen Anderson        }
183745825f431920662e97bdab5c1bcfac62e48c52fOwen Anderson
1847eec0c243320fb2629554681547d7384ea9d0c53Owen Anderson        // Remap the VNInfo kill indices, which works the same as
1857eec0c243320fb2629554681547d7384ea9d0c53Owen Anderson        // the end indices above.
1864b5b209679f866d3ac6372f963aa7e9906f9a08bOwen Anderson        for (size_t i = 0; i < vni->kills.size(); ++i) {
1874b5b209679f866d3ac6372f963aa7e9906f9a08bOwen Anderson          offset = vni->kills[i] % InstrSlots::NUM;
18829b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson          if (OldI2MI[vni->kills[i] / InstrSlots::NUM])
18929b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson            vni->kills[i] = mi2iMap_[OldI2MI[vni->kills[i] / InstrSlots::NUM]] +
19029b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson                            offset;
19129b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson          else {
19229b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson            unsigned e = 0;
19329b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson            MachineInstr* newInstr = 0;
19429b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson            do {
19529b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson              newInstr = OldI2MI[vni->kills[i] / InstrSlots::NUM + e];
19629b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson              e++;
19729b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson            } while (!newInstr);
19829b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson
19929b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson            vni->kills[i] = mi2iMap_[newInstr];
2007eec0c243320fb2629554681547d7384ea9d0c53Owen Anderson          }
2014b5b209679f866d3ac6372f963aa7e9906f9a08bOwen Anderson        }
20280b3ce65e294a28b88c882d44a5e749a2924c9e3Owen Anderson      }
20380b3ce65e294a28b88c882d44a5e749a2924c9e3Owen Anderson}
20480b3ce65e294a28b88c882d44a5e749a2924c9e3Owen Anderson
20580b3ce65e294a28b88c882d44a5e749a2924c9e3Owen Anderson/// runOnMachineFunction - Register allocate the whole function
20680b3ce65e294a28b88c882d44a5e749a2924c9e3Owen Anderson///
20780b3ce65e294a28b88c882d44a5e749a2924c9e3Owen Andersonbool LiveIntervals::runOnMachineFunction(MachineFunction &fn) {
20880b3ce65e294a28b88c882d44a5e749a2924c9e3Owen Anderson  mf_ = &fn;
20980b3ce65e294a28b88c882d44a5e749a2924c9e3Owen Anderson  mri_ = &mf_->getRegInfo();
21080b3ce65e294a28b88c882d44a5e749a2924c9e3Owen Anderson  tm_ = &fn.getTarget();
21180b3ce65e294a28b88c882d44a5e749a2924c9e3Owen Anderson  tri_ = tm_->getRegisterInfo();
21280b3ce65e294a28b88c882d44a5e749a2924c9e3Owen Anderson  tii_ = tm_->getInstrInfo();
21380b3ce65e294a28b88c882d44a5e749a2924c9e3Owen Anderson  lv_ = &getAnalysis<LiveVariables>();
21480b3ce65e294a28b88c882d44a5e749a2924c9e3Owen Anderson  allocatableRegs_ = tri_->getAllocatableSet(fn);
215ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
21680b3ce65e294a28b88c882d44a5e749a2924c9e3Owen Anderson  computeNumbering();
2171a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  computeIntervals();
218ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
2191a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  numIntervals += getNumIntervals();
220843b160a2040b3ec4d3452678450afa11704c473Alkis Evlogimenos
221bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << "********** INTERVALS **********\n";
222bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  for (iterator I = begin(), E = end(); I != E; ++I) {
2236f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman    I->second.print(DOUT, tri_);
224bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    DOUT << "\n";
225bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  }
2267ac2d3146a196fa0120c579ecd2ddd69652ad230Chris Lattner
2271a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  numIntervalsAfter += getNumIntervals();
22870ca358b7d540b6061236ddf757085042873c12cChris Lattner  DEBUG(dump());
2291a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  return true;
230ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos}
231ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
23270ca358b7d540b6061236ddf757085042873c12cChris Lattner/// print - Implement the dump method.
233ce9653ce449f1409815547e1bf60abcd1332d2c9Reid Spencervoid LiveIntervals::print(std::ostream &O, const Module* ) const {
23470ca358b7d540b6061236ddf757085042873c12cChris Lattner  O << "********** INTERVALS **********\n";
2358e7a70976deee78a84099b916591d40f7a1cdc34Chris Lattner  for (const_iterator I = begin(), E = end(); I != E; ++I) {
2363f32d65912b4da23793dab618d981be2ce11c331Evan Cheng    I->second.print(O, tri_);
2373f32d65912b4da23793dab618d981be2ce11c331Evan Cheng    O << "\n";
2388e7a70976deee78a84099b916591d40f7a1cdc34Chris Lattner  }
23970ca358b7d540b6061236ddf757085042873c12cChris Lattner
24070ca358b7d540b6061236ddf757085042873c12cChris Lattner  O << "********** MACHINEINSTRS **********\n";
24170ca358b7d540b6061236ddf757085042873c12cChris Lattner  for (MachineFunction::iterator mbbi = mf_->begin(), mbbe = mf_->end();
24270ca358b7d540b6061236ddf757085042873c12cChris Lattner       mbbi != mbbe; ++mbbi) {
24370ca358b7d540b6061236ddf757085042873c12cChris Lattner    O << ((Value*)mbbi->getBasicBlock())->getName() << ":\n";
24470ca358b7d540b6061236ddf757085042873c12cChris Lattner    for (MachineBasicBlock::iterator mii = mbbi->begin(),
24570ca358b7d540b6061236ddf757085042873c12cChris Lattner           mie = mbbi->end(); mii != mie; ++mii) {
246477e4555de341c5de780de3720d6f115ec133c4eChris Lattner      O << getInstructionIndex(mii) << '\t' << *mii;
24770ca358b7d540b6061236ddf757085042873c12cChris Lattner    }
24870ca358b7d540b6061236ddf757085042873c12cChris Lattner  }
24970ca358b7d540b6061236ddf757085042873c12cChris Lattner}
25070ca358b7d540b6061236ddf757085042873c12cChris Lattner
251c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng/// conflictsWithPhysRegDef - Returns true if the specified register
252c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng/// is defined during the duration of the specified interval.
253c92da3882ee4e18153bb36fcdf33af393aba8259Evan Chengbool LiveIntervals::conflictsWithPhysRegDef(const LiveInterval &li,
254c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng                                            VirtRegMap &vrm, unsigned reg) {
255c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng  for (LiveInterval::Ranges::const_iterator
256c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng         I = li.ranges.begin(), E = li.ranges.end(); I != E; ++I) {
257c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng    for (unsigned index = getBaseIndex(I->start),
258c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng           end = getBaseIndex(I->end-1) + InstrSlots::NUM; index != end;
259c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng         index += InstrSlots::NUM) {
260c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng      // skip deleted instructions
261c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng      while (index != end && !getInstructionFromIndex(index))
262c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng        index += InstrSlots::NUM;
263c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng      if (index == end) break;
264c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng
265c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng      MachineInstr *MI = getInstructionFromIndex(index);
2665d446265c740c17ed12e693423f0363296670d60Evan Cheng      unsigned SrcReg, DstReg;
2675d446265c740c17ed12e693423f0363296670d60Evan Cheng      if (tii_->isMoveInstr(*MI, SrcReg, DstReg))
2685d446265c740c17ed12e693423f0363296670d60Evan Cheng        if (SrcReg == li.reg || DstReg == li.reg)
2695d446265c740c17ed12e693423f0363296670d60Evan Cheng          continue;
270c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng      for (unsigned i = 0; i != MI->getNumOperands(); ++i) {
271c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng        MachineOperand& mop = MI->getOperand(i);
2725d446265c740c17ed12e693423f0363296670d60Evan Cheng        if (!mop.isRegister())
273c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng          continue;
274c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng        unsigned PhysReg = mop.getReg();
2755d446265c740c17ed12e693423f0363296670d60Evan Cheng        if (PhysReg == 0 || PhysReg == li.reg)
276c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng          continue;
2776f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman        if (TargetRegisterInfo::isVirtualRegister(PhysReg)) {
2785d446265c740c17ed12e693423f0363296670d60Evan Cheng          if (!vrm.hasPhys(PhysReg))
2795d446265c740c17ed12e693423f0363296670d60Evan Cheng            continue;
280c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng          PhysReg = vrm.getPhys(PhysReg);
2815d446265c740c17ed12e693423f0363296670d60Evan Cheng        }
2826f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman        if (PhysReg && tri_->regsOverlap(PhysReg, reg))
283c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng          return true;
284c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng      }
285c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng    }
286c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng  }
287c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng
288c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng  return false;
289c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng}
290c92da3882ee4e18153bb36fcdf33af393aba8259Evan Cheng
291be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattnervoid LiveIntervals::printRegName(unsigned reg) const {
2926f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman  if (TargetRegisterInfo::isPhysicalRegister(reg))
293e6d088acc90e422451e098555d383d4d65b6ce6bBill Wendling    cerr << tri_->getName(reg);
2941a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  else
295e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling    cerr << "%reg" << reg;
296ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos}
297ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
298be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattnervoid LiveIntervals::handleVirtualRegisterDef(MachineBasicBlock *mbb,
299ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos                                             MachineBasicBlock::iterator mi,
3006b098dee286cc6fe5a5a476464d92dec5602e406Owen Anderson                                             unsigned MIIdx, MachineOperand& MO,
301ef0732d25a9882c947984ae3f2afbef5463ba00fEvan Cheng                                             unsigned MOIdx,
302be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner                                             LiveInterval &interval) {
303bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << "\t\tregister: "; DEBUG(printRegName(interval.reg));
3041a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  LiveVariables::VarInfo& vi = lv_->getVarInfo(interval.reg);
3051a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
306419852ca8a01aecde4c0e20af6b7bd6450e70f87Evan Cheng  if (mi->getOpcode() == TargetInstrInfo::IMPLICIT_DEF) {
307419852ca8a01aecde4c0e20af6b7bd6450e70f87Evan Cheng    DOUT << "is a implicit_def\n";
308419852ca8a01aecde4c0e20af6b7bd6450e70f87Evan Cheng    return;
309419852ca8a01aecde4c0e20af6b7bd6450e70f87Evan Cheng  }
310419852ca8a01aecde4c0e20af6b7bd6450e70f87Evan Cheng
311706515727c6d024015fffded2b3109a4f0ac5299Alkis Evlogimenos  // Virtual registers may be defined multiple times (due to phi
312706515727c6d024015fffded2b3109a4f0ac5299Alkis Evlogimenos  // elimination and 2-addr elimination).  Much of what we do only has to be
313706515727c6d024015fffded2b3109a4f0ac5299Alkis Evlogimenos  // done once for the vreg.  We use an empty interval to detect the first
3141a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // time we see a vreg.
3151a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  if (interval.empty()) {
3161a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // Get the Idx of the defining instructions.
3176b128bdc58a496e9f08e4d09416330320761baffChris Lattner    unsigned defIndex = getDefIndex(MIIdx);
3187ecb38be0a533e7b9c7d3b8e9b5c8a6fa5f6b349Evan Cheng    VNInfo *ValNo;
319c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng    MachineInstr *CopyMI = NULL;
32091725b75852443923b419fd23215194cfc65dd88Chris Lattner    unsigned SrcReg, DstReg;
321c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng    if (mi->getOpcode() == TargetInstrInfo::EXTRACT_SUBREG ||
3227e073baedb8232b9519dbe15ea141ff98ccfe6aeEvan Cheng        mi->getOpcode() == TargetInstrInfo::INSERT_SUBREG ||
323c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng        tii_->isMoveInstr(*mi, SrcReg, DstReg))
324c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng      CopyMI = mi;
325c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng    ValNo = interval.getNextValue(defIndex, CopyMI, VNInfoAllocator);
3267ecb38be0a533e7b9c7d3b8e9b5c8a6fa5f6b349Evan Cheng
3277ecb38be0a533e7b9c7d3b8e9b5c8a6fa5f6b349Evan Cheng    assert(ValNo->id == 0 && "First value in interval is not 0?");
3281a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
3291a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // Loop over all of the blocks that the vreg is defined in.  There are
3301a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // two cases we have to handle here.  The most common case is a vreg
3311a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // whose lifetime is contained within a basic block.  In this case there
3321a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // will be a single kill, in MBB, which comes after the definition.
3331a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    if (vi.Kills.size() == 1 && vi.Kills[0]->getParent() == mbb) {
3341a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // FIXME: what about dead vars?
3351a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      unsigned killIdx;
3361a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      if (vi.Kills[0] != mi)
3371a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        killIdx = getUseIndex(getInstructionIndex(vi.Kills[0]))+1;
3381a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      else
3391a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        killIdx = defIndex+1;
3401a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
3411a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // If the kill happens after the definition, we have an intra-block
3421a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // live range.
3431a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      if (killIdx > defIndex) {
34461de82d8853a02fe39c47302432abb70a586704fEvan Cheng        assert(vi.AliveBlocks.none() &&
3451a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos               "Shouldn't be alive across any blocks!");
3467ecb38be0a533e7b9c7d3b8e9b5c8a6fa5f6b349Evan Cheng        LiveRange LR(defIndex, killIdx, ValNo);
3471a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        interval.addRange(LR);
348bdc679d564e67a81792e463f6614b0088f975025Bill Wendling        DOUT << " +" << LR << "\n";
349f3bb2e65d12857f83b273f4ecab013680310bbbcEvan Cheng        interval.addKill(ValNo, killIdx);
3501a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        return;
3511a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      }
3521a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    }
3536097d13b2a624048dbe02e39e2dfb23bfa269b64Chris Lattner
3541a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // The other case we handle is when a virtual register lives to the end
3551a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // of the defining block, potentially live across some blocks, then is
3561a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // live into some number of blocks, but gets killed.  Start by adding a
3571a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // range that goes from this definition to the end of the defining block.
35829b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson    LiveRange NewLR(defIndex,
35929b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson                    getInstructionIndex(&mbb->back()) + InstrSlots::NUM,
36029b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson                    ValNo);
361bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    DOUT << " +" << NewLR;
3621a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    interval.addRange(NewLR);
3631a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
3641a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // Iterate over all of the blocks that the variable is completely
3651a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // live in, adding [insrtIndex(begin), instrIndex(end)+4) to the
3661a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // live interval.
3671a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    for (unsigned i = 0, e = vi.AliveBlocks.size(); i != e; ++i) {
3681a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      if (vi.AliveBlocks[i]) {
36931ec841be1f51a60f5b655aa2a008eb68e48c07aOwen Anderson        LiveRange LR(getMBBStartIdx(i),
370f26e8557deccd5fb28b56548ca5f7ea25aee31c6Evan Cheng                     getMBBEndIdx(i)+1,  // MBB ends at -1.
37131ec841be1f51a60f5b655aa2a008eb68e48c07aOwen Anderson                     ValNo);
37231ec841be1f51a60f5b655aa2a008eb68e48c07aOwen Anderson        interval.addRange(LR);
37331ec841be1f51a60f5b655aa2a008eb68e48c07aOwen Anderson        DOUT << " +" << LR;
3741a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      }
3751a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    }
3761a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
3771a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // Finally, this virtual register is live from the start of any killing
3781a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // block to the 'use' slot of the killing instruction.
3791a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    for (unsigned i = 0, e = vi.Kills.size(); i != e; ++i) {
3801a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      MachineInstr *Kill = vi.Kills[i];
3818df786012dc6b875f31ba4152e09c6e0098082eeEvan Cheng      unsigned killIdx = getUseIndex(getInstructionIndex(Kill))+1;
382428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner      LiveRange LR(getMBBStartIdx(Kill->getParent()),
3837ecb38be0a533e7b9c7d3b8e9b5c8a6fa5f6b349Evan Cheng                   killIdx, ValNo);
3841a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      interval.addRange(LR);
385f3bb2e65d12857f83b273f4ecab013680310bbbcEvan Cheng      interval.addKill(ValNo, killIdx);
386bdc679d564e67a81792e463f6614b0088f975025Bill Wendling      DOUT << " +" << LR;
3871a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    }
3881a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
3891a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  } else {
3901a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // If this is the second time we see a virtual register definition, it
3911a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    // must be due to phi elimination or two addr elimination.  If this is
392bf105c842450d3308d024be203ddd533f37051ecEvan Cheng    // the result of two address elimination, then the vreg is one of the
393bf105c842450d3308d024be203ddd533f37051ecEvan Cheng    // def-and-use register operand.
394ef0732d25a9882c947984ae3f2afbef5463ba00fEvan Cheng    if (mi->isRegReDefinedByTwoAddr(interval.reg, MOIdx)) {
3951a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // If this is a two-address definition, then we have already processed
3961a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // the live range.  The only problem is that we didn't realize there
3971a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // are actually two values in the live interval.  Because of this we
3981a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // need to take the LiveRegion that defines this register and split it
3991a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // into two values.
400a07cec9e24a286157541d2337cd66b24cd116586Evan Cheng      assert(interval.containsOneValue());
401a07cec9e24a286157541d2337cd66b24cd116586Evan Cheng      unsigned DefIndex = getDefIndex(interval.getValNumInfo(0)->def);
4026b128bdc58a496e9f08e4d09416330320761baffChris Lattner      unsigned RedefIndex = getDefIndex(MIIdx);
4031a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
4044f8ff168de12eabdeb4b9437bf9402489ecf85cbEvan Cheng      const LiveRange *OldLR = interval.getLiveRangeContaining(RedefIndex-1);
4057ecb38be0a533e7b9c7d3b8e9b5c8a6fa5f6b349Evan Cheng      VNInfo *OldValNo = OldLR->valno;
4064f8ff168de12eabdeb4b9437bf9402489ecf85cbEvan Cheng
4071a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // Delete the initial value, which should be short and continuous,
408be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner      // because the 2-addr copy must be in the same MBB as the redef.
4091a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      interval.removeRange(DefIndex, RedefIndex);
410706515727c6d024015fffded2b3109a4f0ac5299Alkis Evlogimenos
411be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner      // Two-address vregs should always only be redefined once.  This means
412be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner      // that at this point, there should be exactly one value number in it.
413be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner      assert(interval.containsOneValue() && "Unexpected 2-addr liveint!");
414be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner
41591725b75852443923b419fd23215194cfc65dd88Chris Lattner      // The new value number (#1) is defined by the instruction we claimed
41691725b75852443923b419fd23215194cfc65dd88Chris Lattner      // defined value #0.
417c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng      VNInfo *ValNo = interval.getNextValue(OldValNo->def, OldValNo->copy,
418c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng                                            VNInfoAllocator);
419be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner
42091725b75852443923b419fd23215194cfc65dd88Chris Lattner      // Value#0 is now defined by the 2-addr instruction.
421c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng      OldValNo->def  = RedefIndex;
422c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng      OldValNo->copy = 0;
423be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner
424be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner      // Add the new live interval which replaces the range for the input copy.
425be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner      LiveRange LR(DefIndex, RedefIndex, ValNo);
426bdc679d564e67a81792e463f6614b0088f975025Bill Wendling      DOUT << " replace range with " << LR;
4271a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      interval.addRange(LR);
428f3bb2e65d12857f83b273f4ecab013680310bbbcEvan Cheng      interval.addKill(ValNo, RedefIndex);
4291a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
4301a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // If this redefinition is dead, we need to add a dummy unit live
4311a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // range covering the def slot.
4326b098dee286cc6fe5a5a476464d92dec5602e406Owen Anderson      if (MO.isDead())
4337ecb38be0a533e7b9c7d3b8e9b5c8a6fa5f6b349Evan Cheng        interval.addRange(LiveRange(RedefIndex, RedefIndex+1, OldValNo));
4341a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
43556fdd7af884a35673fb6dd3e01333960922c3ac2Evan Cheng      DOUT << " RESULT: ";
4366f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman      interval.print(DOUT, tri_);
4371a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
4381a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos    } else {
4391a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // Otherwise, this must be because of phi elimination.  If this is the
4401a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // first redefinition of the vreg that we have seen, go back and change
4411a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // the live range in the PHI block to be a different value number.
4421a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      if (interval.containsOneValue()) {
4431a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        assert(vi.Kills.size() == 1 &&
4441a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos               "PHI elimination vreg should have one kill, the PHI itself!");
4451a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
4461a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        // Remove the old range that we now know has an incorrect number.
447f3bb2e65d12857f83b273f4ecab013680310bbbcEvan Cheng        VNInfo *VNI = interval.getValNumInfo(0);
4481a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        MachineInstr *Killer = vi.Kills[0];
449428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner        unsigned Start = getMBBStartIdx(Killer->getParent());
4501a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        unsigned End = getUseIndex(getInstructionIndex(Killer))+1;
45156fdd7af884a35673fb6dd3e01333960922c3ac2Evan Cheng        DOUT << " Removing [" << Start << "," << End << "] from: ";
4526f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman        interval.print(DOUT, tri_); DOUT << "\n";
4531a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        interval.removeRange(Start, End);
454c3fc7d9ec9b495c8a88cd854247105c296d3aabdEvan Cheng        VNI->hasPHIKill = true;
4556f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman        DOUT << " RESULT: "; interval.print(DOUT, tri_);
4561a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
457be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner        // Replace the interval with one of a NEW value number.  Note that this
458be4f88a8b8bb3311e0dc4cde8533763d7923c3eaChris Lattner        // value number isn't actually defined by an instruction, weird huh? :)
459f3bb2e65d12857f83b273f4ecab013680310bbbcEvan Cheng        LiveRange LR(Start, End, interval.getNextValue(~0, 0, VNInfoAllocator));
460bdc679d564e67a81792e463f6614b0088f975025Bill Wendling        DOUT << " replace range with " << LR;
4611a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        interval.addRange(LR);
462f3bb2e65d12857f83b273f4ecab013680310bbbcEvan Cheng        interval.addKill(LR.valno, End);
4636f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman        DOUT << " RESULT: "; interval.print(DOUT, tri_);
4641a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      }
4651a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
4661a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // In the case of PHI elimination, each variable definition is only
4671a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // live until the end of the block.  We've already taken care of the
4681a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      // rest of the live range.
4696b128bdc58a496e9f08e4d09416330320761baffChris Lattner      unsigned defIndex = getDefIndex(MIIdx);
47091725b75852443923b419fd23215194cfc65dd88Chris Lattner
4717ecb38be0a533e7b9c7d3b8e9b5c8a6fa5f6b349Evan Cheng      VNInfo *ValNo;
472c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng      MachineInstr *CopyMI = NULL;
47391725b75852443923b419fd23215194cfc65dd88Chris Lattner      unsigned SrcReg, DstReg;
474c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng      if (mi->getOpcode() == TargetInstrInfo::EXTRACT_SUBREG ||
4757e073baedb8232b9519dbe15ea141ff98ccfe6aeEvan Cheng          mi->getOpcode() == TargetInstrInfo::INSERT_SUBREG ||
476c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng          tii_->isMoveInstr(*mi, SrcReg, DstReg))
477c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng        CopyMI = mi;
478c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng      ValNo = interval.getNextValue(defIndex, CopyMI, VNInfoAllocator);
47991725b75852443923b419fd23215194cfc65dd88Chris Lattner
48029b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson      unsigned killIndex = getInstructionIndex(&mbb->back()) + InstrSlots::NUM;
4817ecb38be0a533e7b9c7d3b8e9b5c8a6fa5f6b349Evan Cheng      LiveRange LR(defIndex, killIndex, ValNo);
4821a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      interval.addRange(LR);
483c3fc7d9ec9b495c8a88cd854247105c296d3aabdEvan Cheng      interval.addKill(ValNo, killIndex);
484c3fc7d9ec9b495c8a88cd854247105c296d3aabdEvan Cheng      ValNo->hasPHIKill = true;
485bdc679d564e67a81792e463f6614b0088f975025Bill Wendling      DOUT << " +" << LR;
486dd2cc65f34f9b7bfda1cd0c42becedfc361d46f8Alkis Evlogimenos    }
4871a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  }
488ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
489bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << '\n';
490ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos}
491ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
492f35fef7060c465dd7b578bf6339a18e8a8911888Chris Lattnervoid LiveIntervals::handlePhysicalRegisterDef(MachineBasicBlock *MBB,
493ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos                                              MachineBasicBlock::iterator mi,
4946b128bdc58a496e9f08e4d09416330320761baffChris Lattner                                              unsigned MIIdx,
4956b098dee286cc6fe5a5a476464d92dec5602e406Owen Anderson                                              MachineOperand& MO,
49691725b75852443923b419fd23215194cfc65dd88Chris Lattner                                              LiveInterval &interval,
497c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng                                              MachineInstr *CopyMI) {
4981a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // A physical register cannot be live across basic block, so its
4991a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // lifetime must end somewhere in its defining basic block.
500bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << "\t\tregister: "; DEBUG(printRegName(interval.reg));
5011a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
5026b128bdc58a496e9f08e4d09416330320761baffChris Lattner  unsigned baseIndex = MIIdx;
5031a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  unsigned start = getDefIndex(baseIndex);
5041a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  unsigned end = start;
5051a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
5061a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // If it is not used after definition, it is considered dead at
5071a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // the instruction defining it. Hence its interval is:
5081a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // [defSlot(def), defSlot(def)+1)
5096b098dee286cc6fe5a5a476464d92dec5602e406Owen Anderson  if (MO.isDead()) {
510bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    DOUT << " dead";
511ab4b66d4c279e8cd9e448687020fc838e7881dbcChris Lattner    end = getDefIndex(start) + 1;
512ab4b66d4c279e8cd9e448687020fc838e7881dbcChris Lattner    goto exit;
5131a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  }
514ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
5151a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // If it is not dead on definition, it must be killed by a
5161a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // subsequent instruction. Hence its interval is:
5171a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  // [defSlot(def), useSlot(kill)+1)
5185ab6f5fe666d0e3403d9b777324d1a1999118153Chris Lattner  while (++mi != MBB->end()) {
51929b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson    baseIndex += InstrSlots::NUM;
5206130f66eaae89f8878590796977678afa8448926Evan Cheng    if (mi->killsRegister(interval.reg, tri_)) {
521bdc679d564e67a81792e463f6614b0088f975025Bill Wendling      DOUT << " killed";
522ab4b66d4c279e8cd9e448687020fc838e7881dbcChris Lattner      end = getUseIndex(baseIndex) + 1;
523ab4b66d4c279e8cd9e448687020fc838e7881dbcChris Lattner      goto exit;
5246130f66eaae89f8878590796977678afa8448926Evan Cheng    } else if (mi->modifiesRegister(interval.reg, tri_)) {
5259a1956ae6ad2d4892afbc9f1b97d645d220b6d4aEvan Cheng      // Another instruction redefines the register before it is ever read.
5269a1956ae6ad2d4892afbc9f1b97d645d220b6d4aEvan Cheng      // Then the register is essentially dead at the instruction that defines
5279a1956ae6ad2d4892afbc9f1b97d645d220b6d4aEvan Cheng      // it. Hence its interval is:
5289a1956ae6ad2d4892afbc9f1b97d645d220b6d4aEvan Cheng      // [defSlot(def), defSlot(def)+1)
529bdc679d564e67a81792e463f6614b0088f975025Bill Wendling      DOUT << " dead";
5309a1956ae6ad2d4892afbc9f1b97d645d220b6d4aEvan Cheng      end = getDefIndex(start) + 1;
5319a1956ae6ad2d4892afbc9f1b97d645d220b6d4aEvan Cheng      goto exit;
532f35fef7060c465dd7b578bf6339a18e8a8911888Chris Lattner    }
5331a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  }
5345ab6f5fe666d0e3403d9b777324d1a1999118153Chris Lattner
5355ab6f5fe666d0e3403d9b777324d1a1999118153Chris Lattner  // The only case we should have a dead physreg here without a killing or
5365ab6f5fe666d0e3403d9b777324d1a1999118153Chris Lattner  // instruction where we know it's dead is if it is live-in to the function
5375ab6f5fe666d0e3403d9b777324d1a1999118153Chris Lattner  // and never used.
538c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng  assert(!CopyMI && "physreg was not killed in defining block!");
5395ab6f5fe666d0e3403d9b777324d1a1999118153Chris Lattner  end = getDefIndex(start) + 1;  // It's dead.
54002ba13c9897ae2b19f9201e57460d7ee2b753a0bAlkis Evlogimenos
541ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenosexit:
5421a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  assert(start < end && "did not find end of interval?");
543f768bba43f5c036039851d2fcca8212edca18467Chris Lattner
54424a3cc4c83e5edb25fadf7b8979a26b4451795c6Evan Cheng  // Already exists? Extend old live interval.
54524a3cc4c83e5edb25fadf7b8979a26b4451795c6Evan Cheng  LiveInterval::iterator OldLR = interval.FindLiveRangeContaining(start);
5467ecb38be0a533e7b9c7d3b8e9b5c8a6fa5f6b349Evan Cheng  VNInfo *ValNo = (OldLR != interval.end())
547c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng    ? OldLR->valno : interval.getNextValue(start, CopyMI, VNInfoAllocator);
5487ecb38be0a533e7b9c7d3b8e9b5c8a6fa5f6b349Evan Cheng  LiveRange LR(start, end, ValNo);
5491a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  interval.addRange(LR);
550f3bb2e65d12857f83b273f4ecab013680310bbbcEvan Cheng  interval.addKill(LR.valno, end);
551bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << " +" << LR << '\n';
552ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos}
553ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos
554f35fef7060c465dd7b578bf6339a18e8a8911888Chris Lattnervoid LiveIntervals::handleRegisterDef(MachineBasicBlock *MBB,
555f35fef7060c465dd7b578bf6339a18e8a8911888Chris Lattner                                      MachineBasicBlock::iterator MI,
5566b128bdc58a496e9f08e4d09416330320761baffChris Lattner                                      unsigned MIIdx,
557ef0732d25a9882c947984ae3f2afbef5463ba00fEvan Cheng                                      MachineOperand& MO,
558ef0732d25a9882c947984ae3f2afbef5463ba00fEvan Cheng                                      unsigned MOIdx) {
5596b098dee286cc6fe5a5a476464d92dec5602e406Owen Anderson  if (TargetRegisterInfo::isVirtualRegister(MO.getReg()))
560ef0732d25a9882c947984ae3f2afbef5463ba00fEvan Cheng    handleVirtualRegisterDef(MBB, MI, MIIdx, MO, MOIdx,
5616b098dee286cc6fe5a5a476464d92dec5602e406Owen Anderson                             getOrCreateInterval(MO.getReg()));
5626b098dee286cc6fe5a5a476464d92dec5602e406Owen Anderson  else if (allocatableRegs_[MO.getReg()]) {
563c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng    MachineInstr *CopyMI = NULL;
56491725b75852443923b419fd23215194cfc65dd88Chris Lattner    unsigned SrcReg, DstReg;
565c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng    if (MI->getOpcode() == TargetInstrInfo::EXTRACT_SUBREG ||
5667e073baedb8232b9519dbe15ea141ff98ccfe6aeEvan Cheng        MI->getOpcode() == TargetInstrInfo::INSERT_SUBREG ||
567c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng        tii_->isMoveInstr(*MI, SrcReg, DstReg))
568c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng      CopyMI = MI;
5696b098dee286cc6fe5a5a476464d92dec5602e406Owen Anderson    handlePhysicalRegisterDef(MBB, MI, MIIdx, MO,
5706b098dee286cc6fe5a5a476464d92dec5602e406Owen Anderson                              getOrCreateInterval(MO.getReg()), CopyMI);
57124a3cc4c83e5edb25fadf7b8979a26b4451795c6Evan Cheng    // Def of a register also defines its sub-registers.
5726b098dee286cc6fe5a5a476464d92dec5602e406Owen Anderson    for (const unsigned* AS = tri_->getSubRegisters(MO.getReg()); *AS; ++AS)
5736130f66eaae89f8878590796977678afa8448926Evan Cheng      // If MI also modifies the sub-register explicitly, avoid processing it
5746130f66eaae89f8878590796977678afa8448926Evan Cheng      // more than once. Do not pass in TRI here so it checks for exact match.
5756130f66eaae89f8878590796977678afa8448926Evan Cheng      if (!MI->modifiesRegister(*AS))
5766b098dee286cc6fe5a5a476464d92dec5602e406Owen Anderson        handlePhysicalRegisterDef(MBB, MI, MIIdx, MO,
5776b098dee286cc6fe5a5a476464d92dec5602e406Owen Anderson                                  getOrCreateInterval(*AS), 0);
578f35fef7060c465dd7b578bf6339a18e8a8911888Chris Lattner  }
5794d46e1e521c0df1990ea50f8146d22bd77ea71a6Alkis Evlogimenos}
5804d46e1e521c0df1990ea50f8146d22bd77ea71a6Alkis Evlogimenos
581b371f457b0ea4a652a9f526ba4375c80ae542252Evan Chengvoid LiveIntervals::handleLiveInRegister(MachineBasicBlock *MBB,
5829b25b8ca24d6df2e097741dcc15016772ee4eda7Jim Laskey                                         unsigned MIIdx,
58324a3cc4c83e5edb25fadf7b8979a26b4451795c6Evan Cheng                                         LiveInterval &interval, bool isAlias) {
584b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  DOUT << "\t\tlivein register: "; DEBUG(printRegName(interval.reg));
585b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
586b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  // Look for kills, if it reaches a def before it's killed, then it shouldn't
587b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  // be considered a livein.
588b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  MachineBasicBlock::iterator mi = MBB->begin();
5899b25b8ca24d6df2e097741dcc15016772ee4eda7Jim Laskey  unsigned baseIndex = MIIdx;
5909b25b8ca24d6df2e097741dcc15016772ee4eda7Jim Laskey  unsigned start = baseIndex;
591b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  unsigned end = start;
592b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  while (mi != MBB->end()) {
5936130f66eaae89f8878590796977678afa8448926Evan Cheng    if (mi->killsRegister(interval.reg, tri_)) {
594b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      DOUT << " killed";
595b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      end = getUseIndex(baseIndex) + 1;
596b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      goto exit;
5976130f66eaae89f8878590796977678afa8448926Evan Cheng    } else if (mi->modifiesRegister(interval.reg, tri_)) {
598b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      // Another instruction redefines the register before it is ever read.
599b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      // Then the register is essentially dead at the instruction that defines
600b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      // it. Hence its interval is:
601b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      // [defSlot(def), defSlot(def)+1)
602b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      DOUT << " dead";
603b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      end = getDefIndex(start) + 1;
604b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      goto exit;
605b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    }
606b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
607b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    baseIndex += InstrSlots::NUM;
608b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    ++mi;
609b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  }
610b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
611b371f457b0ea4a652a9f526ba4375c80ae542252Evan Chengexit:
61275611fb4e6ab253be30ac29a2b15e9bf8c1d146eEvan Cheng  // Live-in register might not be used at all.
61375611fb4e6ab253be30ac29a2b15e9bf8c1d146eEvan Cheng  if (end == MIIdx) {
614292da949f6c87d6499425d64d37d7c5870ec57adEvan Cheng    if (isAlias) {
615292da949f6c87d6499425d64d37d7c5870ec57adEvan Cheng      DOUT << " dead";
61675611fb4e6ab253be30ac29a2b15e9bf8c1d146eEvan Cheng      end = getDefIndex(MIIdx) + 1;
617292da949f6c87d6499425d64d37d7c5870ec57adEvan Cheng    } else {
618292da949f6c87d6499425d64d37d7c5870ec57adEvan Cheng      DOUT << " live through";
619292da949f6c87d6499425d64d37d7c5870ec57adEvan Cheng      end = baseIndex;
620292da949f6c87d6499425d64d37d7c5870ec57adEvan Cheng    }
62124a3cc4c83e5edb25fadf7b8979a26b4451795c6Evan Cheng  }
62224a3cc4c83e5edb25fadf7b8979a26b4451795c6Evan Cheng
623f3bb2e65d12857f83b273f4ecab013680310bbbcEvan Cheng  LiveRange LR(start, end, interval.getNextValue(start, 0, VNInfoAllocator));
6249b25b8ca24d6df2e097741dcc15016772ee4eda7Jim Laskey  interval.addRange(LR);
625f3bb2e65d12857f83b273f4ecab013680310bbbcEvan Cheng  interval.addKill(LR.valno, end);
62624c2e5cf7e926452ea5875d027ec0d24d9c19e39Evan Cheng  DOUT << " +" << LR << '\n';
627b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng}
628b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
629ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos/// computeIntervals - computes the live intervals for virtual
6304d46e1e521c0df1990ea50f8146d22bd77ea71a6Alkis Evlogimenos/// registers. for some ordering of the machine instructions [1,N] a
63108cec00588ec1a8fa85b208555f006d7396ae7a4Alkis Evlogimenos/// live interval is an interval [i, j) where 1 <= i <= j < N for
632ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos/// which a variable is live
633f7da2c7b0c6293c268881628fc351bed7763f1f4Chris Lattnervoid LiveIntervals::computeIntervals() {
634bdc679d564e67a81792e463f6614b0088f975025Bill Wendling  DOUT << "********** COMPUTING LIVE INTERVALS **********\n"
635bdc679d564e67a81792e463f6614b0088f975025Bill Wendling       << "********** Function: "
636bdc679d564e67a81792e463f6614b0088f975025Bill Wendling       << ((Value*)mf_->getFunction())->getName() << '\n';
6376b128bdc58a496e9f08e4d09416330320761baffChris Lattner  // Track the index of the current machine instr.
6386b128bdc58a496e9f08e4d09416330320761baffChris Lattner  unsigned MIIndex = 0;
639428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner  for (MachineFunction::iterator MBBI = mf_->begin(), E = mf_->end();
640428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner       MBBI != E; ++MBBI) {
641428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner    MachineBasicBlock *MBB = MBBI;
642bdc679d564e67a81792e463f6614b0088f975025Bill Wendling    DOUT << ((Value*)MBB->getBasicBlock())->getName() << ":\n";
6431a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
644428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner    MachineBasicBlock::iterator MI = MBB->begin(), miEnd = MBB->end();
6450c9f92e1ff64ee56724eae444a0442b02f83d0a8Evan Cheng
646cb406c25973b4e88a6c10ad839ef1beeb3664715Dan Gohman    // Create intervals for live-ins to this BB first.
647cb406c25973b4e88a6c10ad839ef1beeb3664715Dan Gohman    for (MachineBasicBlock::const_livein_iterator LI = MBB->livein_begin(),
648cb406c25973b4e88a6c10ad839ef1beeb3664715Dan Gohman           LE = MBB->livein_end(); LI != LE; ++LI) {
649cb406c25973b4e88a6c10ad839ef1beeb3664715Dan Gohman      handleLiveInRegister(MBB, MIIndex, getOrCreateInterval(*LI));
650cb406c25973b4e88a6c10ad839ef1beeb3664715Dan Gohman      // Multiple live-ins can alias the same register.
6516f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman      for (const unsigned* AS = tri_->getSubRegisters(*LI); *AS; ++AS)
652cb406c25973b4e88a6c10ad839ef1beeb3664715Dan Gohman        if (!hasInterval(*AS))
653cb406c25973b4e88a6c10ad839ef1beeb3664715Dan Gohman          handleLiveInRegister(MBB, MIIndex, getOrCreateInterval(*AS),
654cb406c25973b4e88a6c10ad839ef1beeb3664715Dan Gohman                               true);
655dffb2e83ed2546226d09c40aa43524e2392322daChris Lattner    }
656dffb2e83ed2546226d09c40aa43524e2392322daChris Lattner
657428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner    for (; MI != miEnd; ++MI) {
658bdc679d564e67a81792e463f6614b0088f975025Bill Wendling      DOUT << MIIndex << "\t" << *MI;
6591a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos
660438f7bc67cf235ccee7e6f7ac7f4ae2186eb8020Evan Cheng      // Handle defs.
661428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner      for (int i = MI->getNumOperands() - 1; i >= 0; --i) {
662428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner        MachineOperand &MO = MI->getOperand(i);
6631a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos        // handle register defs - build intervals
664428b92eb83b457b71d29d1d4b7900d36a0ce9a53Chris Lattner        if (MO.isRegister() && MO.getReg() && MO.isDef())
665ef0732d25a9882c947984ae3f2afbef5463ba00fEvan Cheng          handleRegisterDef(MBB, MI, MIIndex, MO, i);
6661a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos      }
6676b128bdc58a496e9f08e4d09416330320761baffChris Lattner
6686b128bdc58a496e9f08e4d09416330320761baffChris Lattner      MIIndex += InstrSlots::NUM;
669ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos    }
67029b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson
67129b039976fd682716c6b8ed1cb7084226b2ad84bOwen Anderson    if (MBB->begin() == miEnd) MIIndex += InstrSlots::NUM; // Empty MBB
6721a8ea01f01b30e28e4e3ac0e3a344c4a4d579270Alkis Evlogimenos  }
673ff0cbe175df40e0d2b36e59c6fb72f211f1cba4cAlkis Evlogimenos}
674b27ef248f579b354aab434f63c417ab1103e47e2Alkis Evlogimenos
6754ca980e7f9ce7b78955307c2d07001a24d3b6befEvan Chengbool LiveIntervals::findLiveInMBBs(const LiveRange &LR,
676a5bfc97da713ec9e185226d44e6adb4d3087b304Evan Cheng                              SmallVectorImpl<MachineBasicBlock*> &MBBs) const {
6774ca980e7f9ce7b78955307c2d07001a24d3b6befEvan Cheng  std::vector<IdxMBBPair>::const_iterator I =
6784ca980e7f9ce7b78955307c2d07001a24d3b6befEvan Cheng    std::lower_bound(Idx2MBBMap.begin(), Idx2MBBMap.end(), LR.start);
6794ca980e7f9ce7b78955307c2d07001a24d3b6befEvan Cheng
6804ca980e7f9ce7b78955307c2d07001a24d3b6befEvan Cheng  bool ResVal = false;
6814ca980e7f9ce7b78955307c2d07001a24d3b6befEvan Cheng  while (I != Idx2MBBMap.end()) {
6824ca980e7f9ce7b78955307c2d07001a24d3b6befEvan Cheng    if (LR.end <= I->first)
6834ca980e7f9ce7b78955307c2d07001a24d3b6befEvan Cheng      break;
6844ca980e7f9ce7b78955307c2d07001a24d3b6befEvan Cheng    MBBs.push_back(I->second);
6854ca980e7f9ce7b78955307c2d07001a24d3b6befEvan Cheng    ResVal = true;
6864ca980e7f9ce7b78955307c2d07001a24d3b6befEvan Cheng    ++I;
6874ca980e7f9ce7b78955307c2d07001a24d3b6befEvan Cheng  }
6884ca980e7f9ce7b78955307c2d07001a24d3b6befEvan Cheng  return ResVal;
6894ca980e7f9ce7b78955307c2d07001a24d3b6befEvan Cheng}
6904ca980e7f9ce7b78955307c2d07001a24d3b6befEvan Cheng
6914ca980e7f9ce7b78955307c2d07001a24d3b6befEvan Cheng
692a1613db62fec94845aa8306232fb665273615badAlkis EvlogimenosLiveInterval LiveIntervals::createInterval(unsigned reg) {
6936f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman  float Weight = TargetRegisterInfo::isPhysicalRegister(reg) ?
6947902c75331fa8f38fc8380f5573d935c0d149ef5Jim Laskey                       HUGE_VALF : 0.0F;
695a1613db62fec94845aa8306232fb665273615badAlkis Evlogimenos  return LiveInterval(reg, Weight);
6969a8b490735d216435862a3d52e669357f165550fAlkis Evlogimenos}
697f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng
698c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng/// getVNInfoSourceReg - Helper function that parses the specified VNInfo
699c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng/// copy field and returns the source register that defines it.
700c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Chengunsigned LiveIntervals::getVNInfoSourceReg(const VNInfo *VNI) const {
701c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng  if (!VNI->copy)
702c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng    return 0;
703c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng
704c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng  if (VNI->copy->getOpcode() == TargetInstrInfo::EXTRACT_SUBREG)
705c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng    return VNI->copy->getOperand(1).getReg();
7067e073baedb8232b9519dbe15ea141ff98ccfe6aeEvan Cheng  if (VNI->copy->getOpcode() == TargetInstrInfo::INSERT_SUBREG)
7077e073baedb8232b9519dbe15ea141ff98ccfe6aeEvan Cheng    return VNI->copy->getOperand(2).getReg();
708c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng  unsigned SrcReg, DstReg;
709c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng  if (tii_->isMoveInstr(*VNI->copy, SrcReg, DstReg))
710c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng    return SrcReg;
711c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng  assert(0 && "Unrecognized copy instruction!");
712c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng  return 0;
713c8d044e4f779fdcfc5e7d592927740fd8f672a70Evan Cheng}
714f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng
715f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng//===----------------------------------------------------------------------===//
716f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng// Register allocator hooks.
717f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng//
718f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng
719d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng/// getReMatImplicitUse - If the remat definition MI has one (for now, we only
720d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng/// allow one) virtual register operand, then its uses are implicitly using
721d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng/// the register. Returns the virtual register.
722d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Chengunsigned LiveIntervals::getReMatImplicitUse(const LiveInterval &li,
723d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng                                            MachineInstr *MI) const {
724d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng  unsigned RegOp = 0;
725d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
726d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    MachineOperand &MO = MI->getOperand(i);
727d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    if (!MO.isRegister() || !MO.isUse())
728d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng      continue;
729d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    unsigned Reg = MO.getReg();
730d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    if (Reg == 0 || Reg == li.reg)
731d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng      continue;
732d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    // FIXME: For now, only remat MI with at most one register operand.
733d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    assert(!RegOp &&
734d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng           "Can't rematerialize instruction with multiple register operand!");
735d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    RegOp = MO.getReg();
736d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    break;
737d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng  }
738d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng  return RegOp;
739d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng}
740d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng
741d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng/// isValNoAvailableAt - Return true if the val# of the specified interval
742d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng/// which reaches the given instruction also reaches the specified use index.
743d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Chengbool LiveIntervals::isValNoAvailableAt(const LiveInterval &li, MachineInstr *MI,
744d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng                                       unsigned UseIdx) const {
745d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng  unsigned Index = getInstructionIndex(MI);
746d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng  VNInfo *ValNo = li.FindLiveRangeContaining(Index)->valno;
747d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng  LiveInterval::const_iterator UI = li.FindLiveRangeContaining(UseIdx);
748d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng  return UI != li.end() && UI->valno == ValNo;
749d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng}
750d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng
751f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng/// isReMaterializable - Returns true if the definition MI of the specified
752f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng/// val# of the specified interval is re-materializable.
753f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Chengbool LiveIntervals::isReMaterializable(const LiveInterval &li,
7545ef3a04b542c4e585276768fa9ca2af698ef5c87Evan Cheng                                       const VNInfo *ValNo, MachineInstr *MI,
7555ef3a04b542c4e585276768fa9ca2af698ef5c87Evan Cheng                                       bool &isLoad) {
756f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  if (DisableReMat)
757f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    return false;
758f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng
7595ef3a04b542c4e585276768fa9ca2af698ef5c87Evan Cheng  isLoad = false;
76020ccded7dec5b90e58f649f4fb95b166a642b8cbEvan Cheng  if (MI->getOpcode() == TargetInstrInfo::IMPLICIT_DEF)
761d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    return true;
762dd3465eed17cdf226bdb465e604dfa851d36029dEvan Cheng
763dd3465eed17cdf226bdb465e604dfa851d36029dEvan Cheng  int FrameIdx = 0;
764dd3465eed17cdf226bdb465e604dfa851d36029dEvan Cheng  if (tii_->isLoadFromStackSlot(MI, FrameIdx) &&
765249ded3fa8884f91fded869fb6e251b8aebb0376Evan Cheng      mf_->getFrameInfo()->isImmutableObjectIndex(FrameIdx))
76679a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng    // FIXME: Let target specific isReallyTriviallyReMaterializable determines
76779a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng    // this but remember this is not safe to fold into a two-address
76879a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng    // instruction.
769249ded3fa8884f91fded869fb6e251b8aebb0376Evan Cheng    // This is a load from fixed stack slot. It can be rematerialized.
770dd3465eed17cdf226bdb465e604dfa851d36029dEvan Cheng    return true;
771dd3465eed17cdf226bdb465e604dfa851d36029dEvan Cheng
772d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng  if (tii_->isTriviallyReMaterializable(MI)) {
77320ccded7dec5b90e58f649f4fb95b166a642b8cbEvan Cheng    const TargetInstrDesc &TID = MI->getDesc();
774749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattner    isLoad = TID.isSimpleLoad();
775d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng
776d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    unsigned ImpUse = getReMatImplicitUse(li, MI);
777d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    if (ImpUse) {
778d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng      const LiveInterval &ImpLi = getInterval(ImpUse);
779d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng      for (MachineRegisterInfo::use_iterator ri = mri_->use_begin(li.reg),
780d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng             re = mri_->use_end(); ri != re; ++ri) {
781d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng        MachineInstr *UseMI = &*ri;
782d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng        unsigned UseIdx = getInstructionIndex(UseMI);
783d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng        if (li.FindLiveRangeContaining(UseIdx)->valno != ValNo)
784d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng          continue;
785298bbe82cb390235f7b8ab4bd550feff909e0c3dEvan Cheng        if (!isValNoAvailableAt(ImpLi, MI, UseIdx))
786d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng          return false;
787d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng      }
788d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    }
789f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    return true;
7905ef3a04b542c4e585276768fa9ca2af698ef5c87Evan Cheng  }
791f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng
792dd3465eed17cdf226bdb465e604dfa851d36029dEvan Cheng  return false;
7935ef3a04b542c4e585276768fa9ca2af698ef5c87Evan Cheng}
7945ef3a04b542c4e585276768fa9ca2af698ef5c87Evan Cheng
7955ef3a04b542c4e585276768fa9ca2af698ef5c87Evan Cheng/// isReMaterializable - Returns true if every definition of MI of every
7965ef3a04b542c4e585276768fa9ca2af698ef5c87Evan Cheng/// val# of the specified interval is re-materializable.
7975ef3a04b542c4e585276768fa9ca2af698ef5c87Evan Chengbool LiveIntervals::isReMaterializable(const LiveInterval &li, bool &isLoad) {
7985ef3a04b542c4e585276768fa9ca2af698ef5c87Evan Cheng  isLoad = false;
7995ef3a04b542c4e585276768fa9ca2af698ef5c87Evan Cheng  for (LiveInterval::const_vni_iterator i = li.vni_begin(), e = li.vni_end();
8005ef3a04b542c4e585276768fa9ca2af698ef5c87Evan Cheng       i != e; ++i) {
8015ef3a04b542c4e585276768fa9ca2af698ef5c87Evan Cheng    const VNInfo *VNI = *i;
8025ef3a04b542c4e585276768fa9ca2af698ef5c87Evan Cheng    unsigned DefIdx = VNI->def;
8035ef3a04b542c4e585276768fa9ca2af698ef5c87Evan Cheng    if (DefIdx == ~1U)
8045ef3a04b542c4e585276768fa9ca2af698ef5c87Evan Cheng      continue; // Dead val#.
8055ef3a04b542c4e585276768fa9ca2af698ef5c87Evan Cheng    // Is the def for the val# rematerializable?
8065ef3a04b542c4e585276768fa9ca2af698ef5c87Evan Cheng    if (DefIdx == ~0u)
8075ef3a04b542c4e585276768fa9ca2af698ef5c87Evan Cheng      return false;
8085ef3a04b542c4e585276768fa9ca2af698ef5c87Evan Cheng    MachineInstr *ReMatDefMI = getInstructionFromIndex(DefIdx);
8095ef3a04b542c4e585276768fa9ca2af698ef5c87Evan Cheng    bool DefIsLoad = false;
810d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    if (!ReMatDefMI ||
811d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng        !isReMaterializable(li, VNI, ReMatDefMI, DefIsLoad))
812f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      return false;
8135ef3a04b542c4e585276768fa9ca2af698ef5c87Evan Cheng    isLoad |= DefIsLoad;
814f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  }
815f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  return true;
816f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng}
817f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng
81879a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng/// FilterFoldedOps - Filter out two-address use operands. Return
81979a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng/// true if it finds any issue with the operands that ought to prevent
82079a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng/// folding.
82179a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Chengstatic bool FilterFoldedOps(MachineInstr *MI,
82279a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng                            SmallVector<unsigned, 2> &Ops,
82379a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng                            unsigned &MRInfo,
82479a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng                            SmallVector<unsigned, 2> &FoldOps) {
825749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattner  const TargetInstrDesc &TID = MI->getDesc();
8266e141fd04897e5eb4925bb6351297170ebd8a756Evan Cheng
82779a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng  MRInfo = 0;
828aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng  for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
829aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng    unsigned OpIdx = Ops[i];
830d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    MachineOperand &MO = MI->getOperand(OpIdx);
831aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng    // FIXME: fold subreg use.
832d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    if (MO.getSubReg())
83379a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng      return true;
834d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    if (MO.isDef())
835aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng      MRInfo |= (unsigned)VirtRegMap::isMod;
836aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng    else {
837aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng      // Filter out two-address use operand(s).
838d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng      if (!MO.isImplicit() &&
839d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng          TID.getOperandConstraint(OpIdx, TOI::TIED_TO) != -1) {
840aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng        MRInfo = VirtRegMap::isModRef;
841aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng        continue;
842aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng      }
843aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng      MRInfo |= (unsigned)VirtRegMap::isRef;
844aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng    }
845aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng    FoldOps.push_back(OpIdx);
846e62f97c094dba44e4c259d20135167fa91912eeaEvan Cheng  }
84779a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng  return false;
84879a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng}
84979a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng
85079a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng
85179a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng/// tryFoldMemoryOperand - Attempts to fold either a spill / restore from
85279a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng/// slot / to reg or any rematerialized load into ith operand of specified
85379a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng/// MI. If it is successul, MI is updated with the newly created MI and
85479a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng/// returns true.
85579a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Chengbool LiveIntervals::tryFoldMemoryOperand(MachineInstr* &MI,
85679a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng                                         VirtRegMap &vrm, MachineInstr *DefMI,
85779a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng                                         unsigned InstrIdx,
85879a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng                                         SmallVector<unsigned, 2> &Ops,
85979a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng                                         bool isSS, int Slot, unsigned Reg) {
86079a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng  // If it is an implicit def instruction, just delete it.
86120ccded7dec5b90e58f649f4fb95b166a642b8cbEvan Cheng  if (MI->getOpcode() == TargetInstrInfo::IMPLICIT_DEF) {
86279a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng    RemoveMachineInstrFromMaps(MI);
86379a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng    vrm.RemoveMachineInstrFromMaps(MI);
86479a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng    MI->eraseFromParent();
86579a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng    ++numFolds;
86679a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng    return true;
86779a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng  }
86879a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng
86979a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng  // Filter the list of operand indexes that are to be folded. Abort if
87079a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng  // any operand will prevent folding.
87179a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng  unsigned MRInfo = 0;
87279a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng  SmallVector<unsigned, 2> FoldOps;
87379a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng  if (FilterFoldedOps(MI, Ops, MRInfo, FoldOps))
87479a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng    return false;
875cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng
876427f4c106ac14dcf323dc1bbaf1b8040da03c3c7Evan Cheng  // The only time it's safe to fold into a two address instruction is when
877427f4c106ac14dcf323dc1bbaf1b8040da03c3c7Evan Cheng  // it's folding reload and spill from / into a spill stack slot.
878427f4c106ac14dcf323dc1bbaf1b8040da03c3c7Evan Cheng  if (DefMI && (MRInfo & VirtRegMap::isMod))
879249ded3fa8884f91fded869fb6e251b8aebb0376Evan Cheng    return false;
880249ded3fa8884f91fded869fb6e251b8aebb0376Evan Cheng
881f2f8c2ae07b7d9bdbf1b89781c573c7af2bd5e1bEvan Cheng  MachineInstr *fmi = isSS ? tii_->foldMemoryOperand(*mf_, MI, FoldOps, Slot)
882f2f8c2ae07b7d9bdbf1b89781c573c7af2bd5e1bEvan Cheng                           : tii_->foldMemoryOperand(*mf_, MI, FoldOps, DefMI);
883f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  if (fmi) {
884d36531249a9a9500e516148e7e72d4c0a7a4d0eeEvan Cheng    // Remember this instruction uses the spill slot.
885d36531249a9a9500e516148e7e72d4c0a7a4d0eeEvan Cheng    if (isSS) vrm.addSpillSlotUse(Slot, fmi);
886d36531249a9a9500e516148e7e72d4c0a7a4d0eeEvan Cheng
887f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    // Attempt to fold the memory reference into the instruction. If
888f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    // we can do this, we don't need to insert spill code.
889f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    MachineBasicBlock &MBB = *MI->getParent();
8908480293f41c11c22762164449e41cd3adb0dd7d8Evan Cheng    if (isSS && !mf_->getFrameInfo()->isImmutableObjectIndex(Slot))
891aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng      vrm.virtFolded(Reg, MI, fmi, (VirtRegMap::ModRef)MRInfo);
89281a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    vrm.transferSpillPts(MI, fmi);
8930cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng    vrm.transferRestorePts(MI, fmi);
894c1f53c742620dd4f2460685477303002bba8a8d8Evan Cheng    vrm.transferEmergencySpills(MI, fmi);
895f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    mi2iMap_.erase(MI);
896cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng    i2miMap_[InstrIdx /InstrSlots::NUM] = fmi;
897cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng    mi2iMap_[fmi] = InstrIdx;
898f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    MI = MBB.insert(MBB.erase(MI), fmi);
8990cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng    ++numFolds;
900f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    return true;
901f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  }
902f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  return false;
903f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng}
904f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng
905018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng/// canFoldMemoryOperand - Returns true if the specified load / store
906018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng/// folding is possible.
907018f9b020bb12b731b0a7081578e5f82fb35092dEvan Chengbool LiveIntervals::canFoldMemoryOperand(MachineInstr *MI,
90879a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng                                         SmallVector<unsigned, 2> &Ops,
9093c75ba858b4e2070993cc1241ba74ead17f647d6Evan Cheng                                         bool ReMat) const {
91079a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng  // Filter the list of operand indexes that are to be folded. Abort if
91179a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng  // any operand will prevent folding.
91279a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng  unsigned MRInfo = 0;
913018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng  SmallVector<unsigned, 2> FoldOps;
91479a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng  if (FilterFoldedOps(MI, Ops, MRInfo, FoldOps))
91579a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng    return false;
916018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng
9173c75ba858b4e2070993cc1241ba74ead17f647d6Evan Cheng  // It's only legal to remat for a use, not a def.
9183c75ba858b4e2070993cc1241ba74ead17f647d6Evan Cheng  if (ReMat && (MRInfo & VirtRegMap::isMod))
91979a0c1e46c4f7d8a2a06f4ef3e2c54d883c7fe25Evan Cheng    return false;
920018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng
921d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng  return tii_->canFoldMemoryOperand(MI, FoldOps);
922d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng}
923d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng
92481a038218171860ee4c382849c647d3dc841fe8bEvan Chengbool LiveIntervals::intervalIsInOneMBB(const LiveInterval &li) const {
92581a038218171860ee4c382849c647d3dc841fe8bEvan Cheng  SmallPtrSet<MachineBasicBlock*, 4> MBBs;
92681a038218171860ee4c382849c647d3dc841fe8bEvan Cheng  for (LiveInterval::Ranges::const_iterator
92781a038218171860ee4c382849c647d3dc841fe8bEvan Cheng         I = li.ranges.begin(), E = li.ranges.end(); I != E; ++I) {
92881a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    std::vector<IdxMBBPair>::const_iterator II =
92981a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      std::lower_bound(Idx2MBBMap.begin(), Idx2MBBMap.end(), I->start);
93081a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    if (II == Idx2MBBMap.end())
93181a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      continue;
93281a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    if (I->end > II->first)  // crossing a MBB.
93381a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      return false;
93481a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    MBBs.insert(II->second);
93581a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    if (MBBs.size() > 1)
93681a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      return false;
93781a038218171860ee4c382849c647d3dc841fe8bEvan Cheng  }
93881a038218171860ee4c382849c647d3dc841fe8bEvan Cheng  return true;
93981a038218171860ee4c382849c647d3dc841fe8bEvan Cheng}
94081a038218171860ee4c382849c647d3dc841fe8bEvan Cheng
941d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng/// rewriteImplicitOps - Rewrite implicit use operands of MI (i.e. uses of
942d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng/// interval on to-be re-materialized operands of MI) with new register.
943d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Chengvoid LiveIntervals::rewriteImplicitOps(const LiveInterval &li,
944d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng                                       MachineInstr *MI, unsigned NewVReg,
945d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng                                       VirtRegMap &vrm) {
946d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng  // There is an implicit use. That means one of the other operand is
947d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng  // being remat'ed and the remat'ed instruction has li.reg as an
948d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng  // use operand. Make sure we rewrite that as well.
949d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
950d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    MachineOperand &MO = MI->getOperand(i);
951d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    if (!MO.isRegister())
952d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng      continue;
953d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    unsigned Reg = MO.getReg();
954d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    if (Reg == 0 || TargetRegisterInfo::isPhysicalRegister(Reg))
955d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng      continue;
956d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    if (!vrm.isReMaterialized(Reg))
957d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng      continue;
958d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    MachineInstr *ReMatMI = vrm.getReMaterializedMI(Reg);
9596130f66eaae89f8878590796977678afa8448926Evan Cheng    MachineOperand *UseMO = ReMatMI->findRegisterUseOperand(li.reg);
9606130f66eaae89f8878590796977678afa8448926Evan Cheng    if (UseMO)
9616130f66eaae89f8878590796977678afa8448926Evan Cheng      UseMO->setReg(NewVReg);
962d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng  }
963d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng}
964d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng
965f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng/// rewriteInstructionForSpills, rewriteInstructionsForSpills - Helper functions
966f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng/// for addIntervalsForSpills to rewrite uses / defs for the given live range.
967018f9b020bb12b731b0a7081578e5f82fb35092dEvan Chengbool LiveIntervals::
968d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan ChengrewriteInstructionForSpills(const LiveInterval &li, const VNInfo *VNI,
969d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng                 bool TrySplit, unsigned index, unsigned end,  MachineInstr *MI,
97081a038218171860ee4c382849c647d3dc841fe8bEvan Cheng                 MachineInstr *ReMatOrigDefMI, MachineInstr *ReMatDefMI,
971f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng                 unsigned Slot, int LdSlot,
972f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng                 bool isLoad, bool isLoadSS, bool DefIsReMat, bool CanDelete,
973d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng                 VirtRegMap &vrm,
974f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng                 const TargetRegisterClass* rc,
975f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng                 SmallVector<int, 4> &ReMatIds,
97622f07ffd27d1d721634d502c37267721d2e025cfEvan Cheng                 const MachineLoopInfo *loopInfo,
977313d4b809326f3e04814f94e5b8ae05649d8e0f6Evan Cheng                 unsigned &NewVReg, unsigned ImpUse, bool &HasDef, bool &HasUse,
9781953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng                 std::map<unsigned,unsigned> &MBBVRegsMap,
9799c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng                 std::vector<LiveInterval*> &NewLIs, float &SSWeight) {
9809c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng  MachineBasicBlock *MBB = MI->getParent();
9819c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng  unsigned loopDepth = loopInfo->getLoopDepth(MBB);
982018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng  bool CanFold = false;
983f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng RestartInstruction:
984f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  for (unsigned i = 0; i != MI->getNumOperands(); ++i) {
985f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    MachineOperand& mop = MI->getOperand(i);
986f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    if (!mop.isRegister())
987f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      continue;
988f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    unsigned Reg = mop.getReg();
989f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    unsigned RegI = Reg;
9906f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman    if (Reg == 0 || TargetRegisterInfo::isPhysicalRegister(Reg))
991f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      continue;
992f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    if (Reg != li.reg)
993f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      continue;
994f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng
995f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    bool TryFold = !DefIsReMat;
996cb3c330d39442130d0587208d673ce9c33c7008fEvan Cheng    bool FoldSS = true; // Default behavior unless it's a remat.
997f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    int FoldSlot = Slot;
998f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    if (DefIsReMat) {
999f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      // If this is the rematerializable definition MI itself and
1000f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      // all of its uses are rematerialized, simply delete it.
100181a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      if (MI == ReMatOrigDefMI && CanDelete) {
1002cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng        DOUT << "\t\t\t\tErasing re-materlizable def: ";
1003cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng        DOUT << MI << '\n';
1004f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng        RemoveMachineInstrFromMaps(MI);
1005cada245d06959831b90f8c29f92e77beda4b71cbEvan Cheng        vrm.RemoveMachineInstrFromMaps(MI);
1006f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng        MI->eraseFromParent();
1007f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng        break;
1008f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      }
1009f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng
1010f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      // If def for this use can't be rematerialized, then try folding.
10110cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng      // If def is rematerializable and it's a load, also try folding.
1012cb3c330d39442130d0587208d673ce9c33c7008fEvan Cheng      TryFold = !ReMatDefMI || (ReMatDefMI && (MI == ReMatOrigDefMI || isLoad));
1013f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      if (isLoad) {
1014f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng        // Try fold loads (from stack slot, constant pool, etc.) into uses.
1015f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng        FoldSS = isLoadSS;
1016f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng        FoldSlot = LdSlot;
1017f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      }
1018f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    }
1019f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng
1020f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    // Scan all of the operands of this instruction rewriting operands
1021f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    // to use NewVReg instead of li.reg as appropriate.  We do this for
1022f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    // two reasons:
1023f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    //
1024f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    //   1. If the instr reads the same spilled vreg multiple times, we
1025f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    //      want to reuse the NewVReg.
1026f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    //   2. If the instr is a two-addr instruction, we are required to
1027f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    //      keep the src/dst regs pinned.
1028f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    //
1029f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    // Keep track of whether we replace a use and/or def so that we can
1030f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    // create the spill interval with the appropriate range.
1031cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng
103281a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    HasUse = mop.isUse();
103381a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    HasDef = mop.isDef();
1034aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng    SmallVector<unsigned, 2> Ops;
1035aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng    Ops.push_back(i);
1036f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    for (unsigned j = i+1, e = MI->getNumOperands(); j != e; ++j) {
1037aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng      const MachineOperand &MOj = MI->getOperand(j);
1038aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng      if (!MOj.isRegister())
1039f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng        continue;
1040aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng      unsigned RegJ = MOj.getReg();
10416f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman      if (RegJ == 0 || TargetRegisterInfo::isPhysicalRegister(RegJ))
1042f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng        continue;
1043f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      if (RegJ == RegI) {
1044aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng        Ops.push_back(j);
1045aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng        HasUse |= MOj.isUse();
1046aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng        HasDef |= MOj.isDef();
1047f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      }
1048f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    }
1049f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng
105079a796c2b17c7ebd4dd489b5de1078fc2148adbaEvan Cheng    if (HasUse && !li.liveAt(getUseIndex(index)))
105179a796c2b17c7ebd4dd489b5de1078fc2148adbaEvan Cheng      // Must be defined by an implicit def. It should not be spilled. Note,
105279a796c2b17c7ebd4dd489b5de1078fc2148adbaEvan Cheng      // this is for correctness reason. e.g.
105379a796c2b17c7ebd4dd489b5de1078fc2148adbaEvan Cheng      // 8   %reg1024<def> = IMPLICIT_DEF
105479a796c2b17c7ebd4dd489b5de1078fc2148adbaEvan Cheng      // 12  %reg1024<def> = INSERT_SUBREG %reg1024<kill>, %reg1025, 2
105579a796c2b17c7ebd4dd489b5de1078fc2148adbaEvan Cheng      // The live range [12, 14) are not part of the r1024 live interval since
105679a796c2b17c7ebd4dd489b5de1078fc2148adbaEvan Cheng      // it's defined by an implicit def. It will not conflicts with live
105779a796c2b17c7ebd4dd489b5de1078fc2148adbaEvan Cheng      // interval of r1025. Now suppose both registers are spilled, you can
1058b9890ae3c35ad7d8e49261650d5b98f49f97a705Evan Cheng      // easily see a situation where both registers are reloaded before
105979a796c2b17c7ebd4dd489b5de1078fc2148adbaEvan Cheng      // the INSERT_SUBREG and both target registers that would overlap.
106079a796c2b17c7ebd4dd489b5de1078fc2148adbaEvan Cheng      HasUse = false;
106179a796c2b17c7ebd4dd489b5de1078fc2148adbaEvan Cheng
10629c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng    // Update stack slot spill weight if we are splitting.
1063c3417609ae6e744a29be6962d4fb7811c0102d17Evan Cheng    float Weight = getSpillWeight(HasDef, HasUse, loopDepth);
10649c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng      if (!TrySplit)
10659c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng      SSWeight += Weight;
10669c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng
10679c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng    if (!TryFold)
10689c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng      CanFold = false;
10699c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng    else {
1070018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng      // Do not fold load / store here if we are splitting. We'll find an
1071018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng      // optimal point to insert a load / store later.
1072018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng      if (!TrySplit) {
1073018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng        if (tryFoldMemoryOperand(MI, vrm, ReMatDefMI, index,
1074018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng                                 Ops, FoldSS, FoldSlot, Reg)) {
1075018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng          // Folding the load/store can completely change the instruction in
1076018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng          // unpredictable ways, rescan it from the beginning.
1077018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng          HasUse = false;
1078018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng          HasDef = false;
1079018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng          CanFold = false;
10809c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng          if (isRemoved(MI)) {
10819c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng            SSWeight -= Weight;
10827e073baedb8232b9519dbe15ea141ff98ccfe6aeEvan Cheng            break;
10839c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng          }
1084018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng          goto RestartInstruction;
1085018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng        }
1086018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng      } else {
10879c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng        // We'll try to fold it later if it's profitable.
10883c75ba858b4e2070993cc1241ba74ead17f647d6Evan Cheng        CanFold = canFoldMemoryOperand(MI, Ops, DefIsReMat);
1089018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng      }
10909c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng    }
1091cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng
1092cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng    // Create a new virtual register for the spill interval.
1093cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng    bool CreatedNewVReg = false;
1094cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng    if (NewVReg == 0) {
1095d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng      NewVReg = mri_->createVirtualRegister(rc);
1096cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng      vrm.grow();
1097cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng      CreatedNewVReg = true;
1098cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng    }
1099cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng    mop.setReg(NewVReg);
1100d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    if (mop.isImplicit())
1101d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng      rewriteImplicitOps(li, MI, NewVReg, vrm);
1102cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng
1103cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng    // Reuse NewVReg for other reads.
1104d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    for (unsigned j = 0, e = Ops.size(); j != e; ++j) {
1105d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng      MachineOperand &mopj = MI->getOperand(Ops[j]);
1106d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng      mopj.setReg(NewVReg);
1107d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng      if (mopj.isImplicit())
1108d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng        rewriteImplicitOps(li, MI, NewVReg, vrm);
1109d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    }
1110cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng
111181a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    if (CreatedNewVReg) {
111281a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      if (DefIsReMat) {
111381a038218171860ee4c382849c647d3dc841fe8bEvan Cheng        vrm.setVirtIsReMaterialized(NewVReg, ReMatDefMI/*, CanDelete*/);
1114d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng        if (ReMatIds[VNI->id] == VirtRegMap::MAX_STACK_SLOT) {
111581a038218171860ee4c382849c647d3dc841fe8bEvan Cheng          // Each valnum may have its own remat id.
1116d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng          ReMatIds[VNI->id] = vrm.assignVirtReMatId(NewVReg);
111781a038218171860ee4c382849c647d3dc841fe8bEvan Cheng        } else {
1118d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng          vrm.assignVirtReMatId(NewVReg, ReMatIds[VNI->id]);
111981a038218171860ee4c382849c647d3dc841fe8bEvan Cheng        }
112081a038218171860ee4c382849c647d3dc841fe8bEvan Cheng        if (!CanDelete || (HasUse && HasDef)) {
112181a038218171860ee4c382849c647d3dc841fe8bEvan Cheng          // If this is a two-addr instruction then its use operands are
112281a038218171860ee4c382849c647d3dc841fe8bEvan Cheng          // rematerializable but its def is not. It should be assigned a
112381a038218171860ee4c382849c647d3dc841fe8bEvan Cheng          // stack slot.
112481a038218171860ee4c382849c647d3dc841fe8bEvan Cheng          vrm.assignVirt2StackSlot(NewVReg, Slot);
112581a038218171860ee4c382849c647d3dc841fe8bEvan Cheng        }
1126f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      } else {
1127f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng        vrm.assignVirt2StackSlot(NewVReg, Slot);
1128f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      }
1129cb3c330d39442130d0587208d673ce9c33c7008fEvan Cheng    } else if (HasUse && HasDef &&
1130cb3c330d39442130d0587208d673ce9c33c7008fEvan Cheng               vrm.getStackSlot(NewVReg) == VirtRegMap::NO_STACK_SLOT) {
1131cb3c330d39442130d0587208d673ce9c33c7008fEvan Cheng      // If this interval hasn't been assigned a stack slot (because earlier
1132cb3c330d39442130d0587208d673ce9c33c7008fEvan Cheng      // def is a deleted remat def), do it now.
1133cb3c330d39442130d0587208d673ce9c33c7008fEvan Cheng      assert(Slot != VirtRegMap::NO_STACK_SLOT);
1134cb3c330d39442130d0587208d673ce9c33c7008fEvan Cheng      vrm.assignVirt2StackSlot(NewVReg, Slot);
1135f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    }
1136f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng
1137313d4b809326f3e04814f94e5b8ae05649d8e0f6Evan Cheng    // Re-matting an instruction with virtual register use. Add the
1138313d4b809326f3e04814f94e5b8ae05649d8e0f6Evan Cheng    // register as an implicit use on the use MI.
1139313d4b809326f3e04814f94e5b8ae05649d8e0f6Evan Cheng    if (DefIsReMat && ImpUse)
1140313d4b809326f3e04814f94e5b8ae05649d8e0f6Evan Cheng      MI->addOperand(MachineOperand::CreateReg(ImpUse, false, true));
1141313d4b809326f3e04814f94e5b8ae05649d8e0f6Evan Cheng
1142f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    // create a new register interval for this spill / remat.
1143f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    LiveInterval &nI = getOrCreateInterval(NewVReg);
114481a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    if (CreatedNewVReg) {
114581a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      NewLIs.push_back(&nI);
11461953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng      MBBVRegsMap.insert(std::make_pair(MI->getParent()->getNumber(), NewVReg));
114781a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      if (TrySplit)
114881a038218171860ee4c382849c647d3dc841fe8bEvan Cheng        vrm.setIsSplitFromReg(NewVReg, li.reg);
114981a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    }
1150f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng
1151f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    if (HasUse) {
115281a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      if (CreatedNewVReg) {
115381a038218171860ee4c382849c647d3dc841fe8bEvan Cheng        LiveRange LR(getLoadIndex(index), getUseIndex(index)+1,
115481a038218171860ee4c382849c647d3dc841fe8bEvan Cheng                     nI.getNextValue(~0U, 0, VNInfoAllocator));
115581a038218171860ee4c382849c647d3dc841fe8bEvan Cheng        DOUT << " +" << LR;
115681a038218171860ee4c382849c647d3dc841fe8bEvan Cheng        nI.addRange(LR);
115781a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      } else {
115881a038218171860ee4c382849c647d3dc841fe8bEvan Cheng        // Extend the split live interval to this def / use.
115981a038218171860ee4c382849c647d3dc841fe8bEvan Cheng        unsigned End = getUseIndex(index)+1;
116081a038218171860ee4c382849c647d3dc841fe8bEvan Cheng        LiveRange LR(nI.ranges[nI.ranges.size()-1].end, End,
116181a038218171860ee4c382849c647d3dc841fe8bEvan Cheng                     nI.getValNumInfo(nI.getNumValNums()-1));
116281a038218171860ee4c382849c647d3dc841fe8bEvan Cheng        DOUT << " +" << LR;
116381a038218171860ee4c382849c647d3dc841fe8bEvan Cheng        nI.addRange(LR);
116481a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      }
1165f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    }
1166f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    if (HasDef) {
1167f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      LiveRange LR(getDefIndex(index), getStoreIndex(index),
1168f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng                   nI.getNextValue(~0U, 0, VNInfoAllocator));
1169f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      DOUT << " +" << LR;
1170f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      nI.addRange(LR);
1171f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    }
117281a038218171860ee4c382849c647d3dc841fe8bEvan Cheng
1173f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    DOUT << "\t\t\t\tAdded new interval: ";
11746f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman    nI.print(DOUT, tri_);
1175f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    DOUT << '\n';
1176f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  }
1177018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng  return CanFold;
1178f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng}
117981a038218171860ee4c382849c647d3dc841fe8bEvan Chengbool LiveIntervals::anyKillInMBBAfterIdx(const LiveInterval &li,
11800cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng                                   const VNInfo *VNI,
11810cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng                                   MachineBasicBlock *MBB, unsigned Idx) const {
118281a038218171860ee4c382849c647d3dc841fe8bEvan Cheng  unsigned End = getMBBEndIdx(MBB);
11830cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng  for (unsigned j = 0, ee = VNI->kills.size(); j != ee; ++j) {
11840cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng    unsigned KillIdx = VNI->kills[j];
11850cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng    if (KillIdx > Idx && KillIdx < End)
11860cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng      return true;
118781a038218171860ee4c382849c647d3dc841fe8bEvan Cheng  }
118881a038218171860ee4c382849c647d3dc841fe8bEvan Cheng  return false;
118981a038218171860ee4c382849c647d3dc841fe8bEvan Cheng}
119081a038218171860ee4c382849c647d3dc841fe8bEvan Cheng
1191063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng/// RewriteInfo - Keep track of machine instrs that will be rewritten
1192063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng/// during spilling.
1193844731a7f1909f55935e3514c9e713a62d67662eDan Gohmannamespace {
1194844731a7f1909f55935e3514c9e713a62d67662eDan Gohman  struct RewriteInfo {
1195844731a7f1909f55935e3514c9e713a62d67662eDan Gohman    unsigned Index;
1196844731a7f1909f55935e3514c9e713a62d67662eDan Gohman    MachineInstr *MI;
1197844731a7f1909f55935e3514c9e713a62d67662eDan Gohman    bool HasUse;
1198844731a7f1909f55935e3514c9e713a62d67662eDan Gohman    bool HasDef;
1199844731a7f1909f55935e3514c9e713a62d67662eDan Gohman    RewriteInfo(unsigned i, MachineInstr *mi, bool u, bool d)
1200844731a7f1909f55935e3514c9e713a62d67662eDan Gohman      : Index(i), MI(mi), HasUse(u), HasDef(d) {}
1201844731a7f1909f55935e3514c9e713a62d67662eDan Gohman  };
1202844731a7f1909f55935e3514c9e713a62d67662eDan Gohman
1203844731a7f1909f55935e3514c9e713a62d67662eDan Gohman  struct RewriteInfoCompare {
1204844731a7f1909f55935e3514c9e713a62d67662eDan Gohman    bool operator()(const RewriteInfo &LHS, const RewriteInfo &RHS) const {
1205844731a7f1909f55935e3514c9e713a62d67662eDan Gohman      return LHS.Index < RHS.Index;
1206844731a7f1909f55935e3514c9e713a62d67662eDan Gohman    }
1207844731a7f1909f55935e3514c9e713a62d67662eDan Gohman  };
1208844731a7f1909f55935e3514c9e713a62d67662eDan Gohman}
1209063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng
1210f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Chengvoid LiveIntervals::
121181a038218171860ee4c382849c647d3dc841fe8bEvan ChengrewriteInstructionsForSpills(const LiveInterval &li, bool TrySplit,
1212f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng                    LiveInterval::Ranges::const_iterator &I,
121381a038218171860ee4c382849c647d3dc841fe8bEvan Cheng                    MachineInstr *ReMatOrigDefMI, MachineInstr *ReMatDefMI,
1214f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng                    unsigned Slot, int LdSlot,
1215f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng                    bool isLoad, bool isLoadSS, bool DefIsReMat, bool CanDelete,
1216d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng                    VirtRegMap &vrm,
1217f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng                    const TargetRegisterClass* rc,
1218f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng                    SmallVector<int, 4> &ReMatIds,
121922f07ffd27d1d721634d502c37267721d2e025cfEvan Cheng                    const MachineLoopInfo *loopInfo,
122081a038218171860ee4c382849c647d3dc841fe8bEvan Cheng                    BitVector &SpillMBBs,
12211953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng                    std::map<unsigned, std::vector<SRInfo> > &SpillIdxes,
12220cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng                    BitVector &RestoreMBBs,
12231953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng                    std::map<unsigned, std::vector<SRInfo> > &RestoreIdxes,
12241953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng                    std::map<unsigned,unsigned> &MBBVRegsMap,
12259c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng                    std::vector<LiveInterval*> &NewLIs, float &SSWeight) {
1226018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng  bool AllCanFold = true;
122781a038218171860ee4c382849c647d3dc841fe8bEvan Cheng  unsigned NewVReg = 0;
1228063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng  unsigned start = getBaseIndex(I->start);
1229f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  unsigned end = getBaseIndex(I->end-1) + InstrSlots::NUM;
1230f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng
1231063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng  // First collect all the def / use in this live range that will be rewritten.
12327e073baedb8232b9519dbe15ea141ff98ccfe6aeEvan Cheng  // Make sure they are sorted according to instruction index.
1233063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng  std::vector<RewriteInfo> RewriteMIs;
1234d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng  for (MachineRegisterInfo::reg_iterator ri = mri_->reg_begin(li.reg),
1235d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng         re = mri_->reg_end(); ri != re; ) {
1236419852ca8a01aecde4c0e20af6b7bd6450e70f87Evan Cheng    MachineInstr *MI = &*ri;
1237063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng    MachineOperand &O = ri.getOperand();
1238063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng    ++ri;
123924d2f8a212f08bf21360122cc00acf2657af91f9Evan Cheng    assert(!O.isImplicit() && "Spilling register that's used as implicit use?");
1240063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng    unsigned index = getInstructionIndex(MI);
1241063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng    if (index < start || index >= end)
1242063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng      continue;
124379a796c2b17c7ebd4dd489b5de1078fc2148adbaEvan Cheng    if (O.isUse() && !li.liveAt(getUseIndex(index)))
124479a796c2b17c7ebd4dd489b5de1078fc2148adbaEvan Cheng      // Must be defined by an implicit def. It should not be spilled. Note,
124579a796c2b17c7ebd4dd489b5de1078fc2148adbaEvan Cheng      // this is for correctness reason. e.g.
124679a796c2b17c7ebd4dd489b5de1078fc2148adbaEvan Cheng      // 8   %reg1024<def> = IMPLICIT_DEF
124779a796c2b17c7ebd4dd489b5de1078fc2148adbaEvan Cheng      // 12  %reg1024<def> = INSERT_SUBREG %reg1024<kill>, %reg1025, 2
124879a796c2b17c7ebd4dd489b5de1078fc2148adbaEvan Cheng      // The live range [12, 14) are not part of the r1024 live interval since
124979a796c2b17c7ebd4dd489b5de1078fc2148adbaEvan Cheng      // it's defined by an implicit def. It will not conflicts with live
125079a796c2b17c7ebd4dd489b5de1078fc2148adbaEvan Cheng      // interval of r1025. Now suppose both registers are spilled, you can
1251b9890ae3c35ad7d8e49261650d5b98f49f97a705Evan Cheng      // easily see a situation where both registers are reloaded before
125279a796c2b17c7ebd4dd489b5de1078fc2148adbaEvan Cheng      // the INSERT_SUBREG and both target registers that would overlap.
125379a796c2b17c7ebd4dd489b5de1078fc2148adbaEvan Cheng      continue;
1254063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng    RewriteMIs.push_back(RewriteInfo(index, MI, O.isUse(), O.isDef()));
1255063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng  }
1256063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng  std::sort(RewriteMIs.begin(), RewriteMIs.end(), RewriteInfoCompare());
1257063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng
1258313d4b809326f3e04814f94e5b8ae05649d8e0f6Evan Cheng  unsigned ImpUse = DefIsReMat ? getReMatImplicitUse(li, ReMatDefMI) : 0;
1259063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng  // Now rewrite the defs and uses.
1260063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng  for (unsigned i = 0, e = RewriteMIs.size(); i != e; ) {
1261063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng    RewriteInfo &rwi = RewriteMIs[i];
1262063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng    ++i;
1263063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng    unsigned index = rwi.Index;
1264063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng    bool MIHasUse = rwi.HasUse;
1265063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng    bool MIHasDef = rwi.HasDef;
1266063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng    MachineInstr *MI = rwi.MI;
1267063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng    // If MI def and/or use the same register multiple times, then there
1268063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng    // are multiple entries.
1269313d4b809326f3e04814f94e5b8ae05649d8e0f6Evan Cheng    unsigned NumUses = MIHasUse;
1270063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng    while (i != e && RewriteMIs[i].MI == MI) {
1271063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng      assert(RewriteMIs[i].Index == index);
1272313d4b809326f3e04814f94e5b8ae05649d8e0f6Evan Cheng      bool isUse = RewriteMIs[i].HasUse;
1273313d4b809326f3e04814f94e5b8ae05649d8e0f6Evan Cheng      if (isUse) ++NumUses;
1274313d4b809326f3e04814f94e5b8ae05649d8e0f6Evan Cheng      MIHasUse |= isUse;
1275063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng      MIHasDef |= RewriteMIs[i].HasDef;
1276063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng      ++i;
1277063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng    }
127881a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    MachineBasicBlock *MBB = MI->getParent();
1279313d4b809326f3e04814f94e5b8ae05649d8e0f6Evan Cheng
12800a891ed7d5875a9ccdb93b4472b0f43947d8289bEvan Cheng    if (ImpUse && MI != ReMatDefMI) {
1281313d4b809326f3e04814f94e5b8ae05649d8e0f6Evan Cheng      // Re-matting an instruction with virtual register use. Update the
128224d2f8a212f08bf21360122cc00acf2657af91f9Evan Cheng      // register interval's spill weight to HUGE_VALF to prevent it from
128324d2f8a212f08bf21360122cc00acf2657af91f9Evan Cheng      // being spilled.
1284313d4b809326f3e04814f94e5b8ae05649d8e0f6Evan Cheng      LiveInterval &ImpLi = getInterval(ImpUse);
128524d2f8a212f08bf21360122cc00acf2657af91f9Evan Cheng      ImpLi.weight = HUGE_VALF;
1286313d4b809326f3e04814f94e5b8ae05649d8e0f6Evan Cheng    }
1287313d4b809326f3e04814f94e5b8ae05649d8e0f6Evan Cheng
1288063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng    unsigned MBBId = MBB->getNumber();
1289018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng    unsigned ThisVReg = 0;
129070306f8348f27c61cfed5a60e2fceac0f29746a2Evan Cheng    if (TrySplit) {
1291063284c001666c0a3906acbe0a26dc7cae5f081cEvan Cheng      std::map<unsigned,unsigned>::const_iterator NVI = MBBVRegsMap.find(MBBId);
12921953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng      if (NVI != MBBVRegsMap.end()) {
1293018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng        ThisVReg = NVI->second;
12941953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng        // One common case:
12951953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng        // x = use
12961953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng        // ...
12971953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng        // ...
12981953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng        // def = ...
12991953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng        //     = use
13001953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng        // It's better to start a new interval to avoid artifically
13011953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng        // extend the new interval.
13021953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng        if (MIHasDef && !MIHasUse) {
13031953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng          MBBVRegsMap.erase(MBB->getNumber());
1304018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng          ThisVReg = 0;
13051953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng        }
13061953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng      }
1307cada245d06959831b90f8c29f92e77beda4b71cbEvan Cheng    }
1308018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng
1309018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng    bool IsNew = ThisVReg == 0;
1310018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng    if (IsNew) {
1311018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng      // This ends the previous live interval. If all of its def / use
1312018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng      // can be folded, give it a low spill weight.
1313018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng      if (NewVReg && TrySplit && AllCanFold) {
1314018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng        LiveInterval &nI = getOrCreateInterval(NewVReg);
1315018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng        nI.weight /= 10.0F;
1316018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng      }
1317018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng      AllCanFold = true;
1318018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng    }
1319018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng    NewVReg = ThisVReg;
1320018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng
132181a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    bool HasDef = false;
132281a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    bool HasUse = false;
1323d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng    bool CanFold = rewriteInstructionForSpills(li, I->valno, TrySplit,
13249c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng                         index, end, MI, ReMatOrigDefMI, ReMatDefMI,
13259c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng                         Slot, LdSlot, isLoad, isLoadSS, DefIsReMat,
13269c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng                         CanDelete, vrm, rc, ReMatIds, loopInfo, NewVReg,
13279c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng                         ImpUse, HasDef, HasUse, MBBVRegsMap, NewLIs, SSWeight);
132881a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    if (!HasDef && !HasUse)
132981a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      continue;
133081a038218171860ee4c382849c647d3dc841fe8bEvan Cheng
1331018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng    AllCanFold &= CanFold;
1332018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng
133381a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    // Update weight of spill interval.
133481a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    LiveInterval &nI = getOrCreateInterval(NewVReg);
133570306f8348f27c61cfed5a60e2fceac0f29746a2Evan Cheng    if (!TrySplit) {
133681a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      // The spill weight is now infinity as it cannot be spilled again.
133781a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      nI.weight = HUGE_VALF;
13380cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng      continue;
13390cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng    }
13400cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng
13410cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng    // Keep track of the last def and first use in each MBB.
13420cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng    if (HasDef) {
13430cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng      if (MI != ReMatOrigDefMI || !CanDelete) {
13440cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng        bool HasKill = false;
13450cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng        if (!HasUse)
13460cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng          HasKill = anyKillInMBBAfterIdx(li, I->valno, MBB, getDefIndex(index));
13470cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng        else {
13481953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng          // If this is a two-address code, then this index starts a new VNInfo.
13493f32d65912b4da23793dab618d981be2ce11c331Evan Cheng          const VNInfo *VNI = li.findDefinedVNInfo(getDefIndex(index));
13500cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng          if (VNI)
13510cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng            HasKill = anyKillInMBBAfterIdx(li, VNI, MBB, getDefIndex(index));
135281a038218171860ee4c382849c647d3dc841fe8bEvan Cheng        }
1353e3110d0825e6316fd2dd21d6a4e593295cd413f1Evan Cheng        std::map<unsigned, std::vector<SRInfo> >::iterator SII =
1354e3110d0825e6316fd2dd21d6a4e593295cd413f1Evan Cheng          SpillIdxes.find(MBBId);
13550cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng        if (!HasKill) {
13561953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng          if (SII == SpillIdxes.end()) {
13571953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng            std::vector<SRInfo> S;
13581953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng            S.push_back(SRInfo(index, NewVReg, true));
13591953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng            SpillIdxes.insert(std::make_pair(MBBId, S));
13601953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng          } else if (SII->second.back().vreg != NewVReg) {
13611953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng            SII->second.push_back(SRInfo(index, NewVReg, true));
13621953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng          } else if ((int)index > SII->second.back().index) {
13630cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng            // If there is an earlier def and this is a two-address
13640cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng            // instruction, then it's not possible to fold the store (which
13650cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng            // would also fold the load).
13661953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng            SRInfo &Info = SII->second.back();
13671953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng            Info.index = index;
13681953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng            Info.canFold = !HasUse;
136981a038218171860ee4c382849c647d3dc841fe8bEvan Cheng          }
13700cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng          SpillMBBs.set(MBBId);
1371e3110d0825e6316fd2dd21d6a4e593295cd413f1Evan Cheng        } else if (SII != SpillIdxes.end() &&
1372e3110d0825e6316fd2dd21d6a4e593295cd413f1Evan Cheng                   SII->second.back().vreg == NewVReg &&
1373e3110d0825e6316fd2dd21d6a4e593295cd413f1Evan Cheng                   (int)index > SII->second.back().index) {
1374e3110d0825e6316fd2dd21d6a4e593295cd413f1Evan Cheng          // There is an earlier def that's not killed (must be two-address).
1375e3110d0825e6316fd2dd21d6a4e593295cd413f1Evan Cheng          // The spill is no longer needed.
1376e3110d0825e6316fd2dd21d6a4e593295cd413f1Evan Cheng          SII->second.pop_back();
1377e3110d0825e6316fd2dd21d6a4e593295cd413f1Evan Cheng          if (SII->second.empty()) {
1378e3110d0825e6316fd2dd21d6a4e593295cd413f1Evan Cheng            SpillIdxes.erase(MBBId);
1379e3110d0825e6316fd2dd21d6a4e593295cd413f1Evan Cheng            SpillMBBs.reset(MBBId);
1380e3110d0825e6316fd2dd21d6a4e593295cd413f1Evan Cheng          }
138181a038218171860ee4c382849c647d3dc841fe8bEvan Cheng        }
138281a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      }
13830cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng    }
138481a038218171860ee4c382849c647d3dc841fe8bEvan Cheng
13850cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng    if (HasUse) {
13861953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng      std::map<unsigned, std::vector<SRInfo> >::iterator SII =
13870cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng        SpillIdxes.find(MBBId);
13881953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng      if (SII != SpillIdxes.end() &&
13891953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng          SII->second.back().vreg == NewVReg &&
13901953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng          (int)index > SII->second.back().index)
13910cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng        // Use(s) following the last def, it's not safe to fold the spill.
13921953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng        SII->second.back().canFold = false;
13931953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng      std::map<unsigned, std::vector<SRInfo> >::iterator RII =
13940cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng        RestoreIdxes.find(MBBId);
13951953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng      if (RII != RestoreIdxes.end() && RII->second.back().vreg == NewVReg)
13960cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng        // If we are splitting live intervals, only fold if it's the first
13970cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng        // use and there isn't another use later in the MBB.
13981953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng        RII->second.back().canFold = false;
13990cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng      else if (IsNew) {
14000cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng        // Only need a reload if there isn't an earlier def / use.
14011953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng        if (RII == RestoreIdxes.end()) {
14021953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng          std::vector<SRInfo> Infos;
14031953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng          Infos.push_back(SRInfo(index, NewVReg, true));
14041953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng          RestoreIdxes.insert(std::make_pair(MBBId, Infos));
14051953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng        } else {
14061953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng          RII->second.push_back(SRInfo(index, NewVReg, true));
14071953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng        }
14080cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng        RestoreMBBs.set(MBBId);
14090cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng      }
141081a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    }
14110cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng
14120cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng    // Update spill weight.
141322f07ffd27d1d721634d502c37267721d2e025cfEvan Cheng    unsigned loopDepth = loopInfo->getLoopDepth(MBB);
1414c3417609ae6e744a29be6962d4fb7811c0102d17Evan Cheng    nI.weight += getSpillWeight(HasDef, HasUse, loopDepth);
1415f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  }
1416018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng
1417018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng  if (NewVReg && TrySplit && AllCanFold) {
1418018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng    // If all of its def / use can be folded, give it a low spill weight.
1419018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng    LiveInterval &nI = getOrCreateInterval(NewVReg);
1420018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng    nI.weight /= 10.0F;
1421018f9b020bb12b731b0a7081578e5f82fb35092dEvan Cheng  }
1422f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng}
1423f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng
14241953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Chengbool LiveIntervals::alsoFoldARestore(int Id, int index, unsigned vr,
14251953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng                        BitVector &RestoreMBBs,
14261953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng                        std::map<unsigned,std::vector<SRInfo> > &RestoreIdxes) {
14271953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng  if (!RestoreMBBs[Id])
14281953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng    return false;
14291953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng  std::vector<SRInfo> &Restores = RestoreIdxes[Id];
14301953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng  for (unsigned i = 0, e = Restores.size(); i != e; ++i)
14311953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng    if (Restores[i].index == index &&
14321953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng        Restores[i].vreg == vr &&
14331953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng        Restores[i].canFold)
14341953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng      return true;
14351953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng  return false;
14361953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng}
14371953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng
14381953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Chengvoid LiveIntervals::eraseRestoreInfo(int Id, int index, unsigned vr,
14391953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng                        BitVector &RestoreMBBs,
14401953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng                        std::map<unsigned,std::vector<SRInfo> > &RestoreIdxes) {
14411953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng  if (!RestoreMBBs[Id])
14421953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng    return;
14431953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng  std::vector<SRInfo> &Restores = RestoreIdxes[Id];
14441953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng  for (unsigned i = 0, e = Restores.size(); i != e; ++i)
14451953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng    if (Restores[i].index == index && Restores[i].vreg)
14461953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng      Restores[i].index = -1;
14471953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng}
144881a038218171860ee4c382849c647d3dc841fe8bEvan Cheng
14494cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng/// handleSpilledImpDefs - Remove IMPLICIT_DEF instructions which are being
14504cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng/// spilled and create empty intervals for their uses.
14514cce6b4c7882ef0cc993d931b90bf33985c96110Evan Chengvoid
14524cce6b4c7882ef0cc993d931b90bf33985c96110Evan ChengLiveIntervals::handleSpilledImpDefs(const LiveInterval &li, VirtRegMap &vrm,
14534cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng                                    const TargetRegisterClass* rc,
14544cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng                                    std::vector<LiveInterval*> &NewLIs) {
1455419852ca8a01aecde4c0e20af6b7bd6450e70f87Evan Cheng  for (MachineRegisterInfo::reg_iterator ri = mri_->reg_begin(li.reg),
1456419852ca8a01aecde4c0e20af6b7bd6450e70f87Evan Cheng         re = mri_->reg_end(); ri != re; ) {
14574cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng    MachineOperand &O = ri.getOperand();
1458419852ca8a01aecde4c0e20af6b7bd6450e70f87Evan Cheng    MachineInstr *MI = &*ri;
1459419852ca8a01aecde4c0e20af6b7bd6450e70f87Evan Cheng    ++ri;
14604cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng    if (O.isDef()) {
14614cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng      assert(MI->getOpcode() == TargetInstrInfo::IMPLICIT_DEF &&
14624cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng             "Register def was not rewritten?");
14634cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng      RemoveMachineInstrFromMaps(MI);
14644cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng      vrm.RemoveMachineInstrFromMaps(MI);
14654cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng      MI->eraseFromParent();
14664cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng    } else {
14674cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng      // This must be an use of an implicit_def so it's not part of the live
14684cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng      // interval. Create a new empty live interval for it.
14694cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng      // FIXME: Can we simply erase some of the instructions? e.g. Stores?
14704cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng      unsigned NewVReg = mri_->createVirtualRegister(rc);
14714cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng      vrm.grow();
14724cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng      vrm.setIsImplicitlyDefined(NewVReg);
14734cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng      NewLIs.push_back(&getOrCreateInterval(NewVReg));
14744cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng      for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
14754cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng        MachineOperand &MO = MI->getOperand(i);
14764cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng        if (MO.isReg() && MO.getReg() == li.reg)
14774cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng          MO.setReg(NewVReg);
14784cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng      }
14794cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng    }
1480419852ca8a01aecde4c0e20af6b7bd6450e70f87Evan Cheng  }
1481419852ca8a01aecde4c0e20af6b7bd6450e70f87Evan Cheng}
1482419852ca8a01aecde4c0e20af6b7bd6450e70f87Evan Cheng
148381a038218171860ee4c382849c647d3dc841fe8bEvan Cheng
1484f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Chengstd::vector<LiveInterval*> LiveIntervals::
148581a038218171860ee4c382849c647d3dc841fe8bEvan ChengaddIntervalsForSpills(const LiveInterval &li,
14869c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng                      const MachineLoopInfo *loopInfo, VirtRegMap &vrm,
14879c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng                      float &SSWeight) {
1488f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  assert(li.weight != HUGE_VALF &&
1489f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng         "attempt to spill already spilled interval!");
1490f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng
1491f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  DOUT << "\t\t\t\tadding intervals for spills for interval: ";
14926f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman  li.print(DOUT, tri_);
1493f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  DOUT << '\n';
1494f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng
14959c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng  // Spill slot weight.
14969c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng  SSWeight = 0.0f;
14979c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng
149881a038218171860ee4c382849c647d3dc841fe8bEvan Cheng  // Each bit specify whether it a spill is required in the MBB.
149981a038218171860ee4c382849c647d3dc841fe8bEvan Cheng  BitVector SpillMBBs(mf_->getNumBlockIDs());
15001953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng  std::map<unsigned, std::vector<SRInfo> > SpillIdxes;
15010cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng  BitVector RestoreMBBs(mf_->getNumBlockIDs());
15021953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng  std::map<unsigned, std::vector<SRInfo> > RestoreIdxes;
15031953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng  std::map<unsigned,unsigned> MBBVRegsMap;
1504f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  std::vector<LiveInterval*> NewLIs;
1505d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng  const TargetRegisterClass* rc = mri_->getRegClass(li.reg);
1506f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng
1507f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  unsigned NumValNums = li.getNumValNums();
1508f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  SmallVector<MachineInstr*, 4> ReMatDefs;
1509f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  ReMatDefs.resize(NumValNums, NULL);
1510f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  SmallVector<MachineInstr*, 4> ReMatOrigDefs;
1511f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  ReMatOrigDefs.resize(NumValNums, NULL);
1512f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  SmallVector<int, 4> ReMatIds;
1513f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  ReMatIds.resize(NumValNums, VirtRegMap::MAX_STACK_SLOT);
1514f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  BitVector ReMatDelete(NumValNums);
1515f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  unsigned Slot = VirtRegMap::MAX_STACK_SLOT;
1516f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng
151781a038218171860ee4c382849c647d3dc841fe8bEvan Cheng  // Spilling a split live interval. It cannot be split any further. Also,
151881a038218171860ee4c382849c647d3dc841fe8bEvan Cheng  // it's also guaranteed to be a single val# / range interval.
151981a038218171860ee4c382849c647d3dc841fe8bEvan Cheng  if (vrm.getPreSplitReg(li.reg)) {
152081a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    vrm.setIsSplitFromReg(li.reg, 0);
1521d120ffd26f2715c600b028d4eac9a3c41a9f4653Evan Cheng    // Unset the split kill marker on the last use.
1522d120ffd26f2715c600b028d4eac9a3c41a9f4653Evan Cheng    unsigned KillIdx = vrm.getKillPoint(li.reg);
1523d120ffd26f2715c600b028d4eac9a3c41a9f4653Evan Cheng    if (KillIdx) {
1524d120ffd26f2715c600b028d4eac9a3c41a9f4653Evan Cheng      MachineInstr *KillMI = getInstructionFromIndex(KillIdx);
1525d120ffd26f2715c600b028d4eac9a3c41a9f4653Evan Cheng      assert(KillMI && "Last use disappeared?");
1526d120ffd26f2715c600b028d4eac9a3c41a9f4653Evan Cheng      int KillOp = KillMI->findRegisterUseOperandIdx(li.reg, true);
1527d120ffd26f2715c600b028d4eac9a3c41a9f4653Evan Cheng      assert(KillOp != -1 && "Last use disappeared?");
1528f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner      KillMI->getOperand(KillOp).setIsKill(false);
1529d120ffd26f2715c600b028d4eac9a3c41a9f4653Evan Cheng    }
1530adf85906906ebf85c57c333e8209f37ef11a6c99Evan Cheng    vrm.removeKillPoint(li.reg);
153181a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    bool DefIsReMat = vrm.isReMaterialized(li.reg);
153281a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    Slot = vrm.getStackSlot(li.reg);
153381a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    assert(Slot != VirtRegMap::MAX_STACK_SLOT);
153481a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    MachineInstr *ReMatDefMI = DefIsReMat ?
153581a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      vrm.getReMaterializedMI(li.reg) : NULL;
153681a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    int LdSlot = 0;
153781a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    bool isLoadSS = DefIsReMat && tii_->isLoadFromStackSlot(ReMatDefMI, LdSlot);
153881a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    bool isLoad = isLoadSS ||
1539749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattner      (DefIsReMat && (ReMatDefMI->getDesc().isSimpleLoad()));
154081a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    bool IsFirstRange = true;
154181a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    for (LiveInterval::Ranges::const_iterator
154281a038218171860ee4c382849c647d3dc841fe8bEvan Cheng           I = li.ranges.begin(), E = li.ranges.end(); I != E; ++I) {
154381a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      // If this is a split live interval with multiple ranges, it means there
154481a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      // are two-address instructions that re-defined the value. Only the
154581a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      // first def can be rematerialized!
154681a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      if (IsFirstRange) {
1547cb3c330d39442130d0587208d673ce9c33c7008fEvan Cheng        // Note ReMatOrigDefMI has already been deleted.
154881a038218171860ee4c382849c647d3dc841fe8bEvan Cheng        rewriteInstructionsForSpills(li, false, I, NULL, ReMatDefMI,
154981a038218171860ee4c382849c647d3dc841fe8bEvan Cheng                             Slot, LdSlot, isLoad, isLoadSS, DefIsReMat,
1550d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng                             false, vrm, rc, ReMatIds, loopInfo,
15510cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng                             SpillMBBs, SpillIdxes, RestoreMBBs, RestoreIdxes,
15529c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng                             MBBVRegsMap, NewLIs, SSWeight);
155381a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      } else {
155481a038218171860ee4c382849c647d3dc841fe8bEvan Cheng        rewriteInstructionsForSpills(li, false, I, NULL, 0,
155581a038218171860ee4c382849c647d3dc841fe8bEvan Cheng                             Slot, 0, false, false, false,
1556d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng                             false, vrm, rc, ReMatIds, loopInfo,
15570cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng                             SpillMBBs, SpillIdxes, RestoreMBBs, RestoreIdxes,
15589c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng                             MBBVRegsMap, NewLIs, SSWeight);
155981a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      }
156081a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      IsFirstRange = false;
156181a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    }
1562419852ca8a01aecde4c0e20af6b7bd6450e70f87Evan Cheng
15639c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng    SSWeight = 0.0f;  // Already accounted for when split.
15644cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng    handleSpilledImpDefs(li, vrm, rc, NewLIs);
156581a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    return NewLIs;
156681a038218171860ee4c382849c647d3dc841fe8bEvan Cheng  }
156781a038218171860ee4c382849c647d3dc841fe8bEvan Cheng
156881a038218171860ee4c382849c647d3dc841fe8bEvan Cheng  bool TrySplit = SplitAtBB && !intervalIsInOneMBB(li);
15690cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng  if (SplitLimit != -1 && (int)numSplits >= SplitLimit)
15700cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng    TrySplit = false;
15710cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng  if (TrySplit)
15720cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng    ++numSplits;
1573f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  bool NeedStackSlot = false;
1574f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  for (LiveInterval::const_vni_iterator i = li.vni_begin(), e = li.vni_end();
1575f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng       i != e; ++i) {
1576f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    const VNInfo *VNI = *i;
1577f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    unsigned VN = VNI->id;
1578f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    unsigned DefIdx = VNI->def;
1579f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    if (DefIdx == ~1U)
1580f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      continue; // Dead val#.
1581f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    // Is the def for the val# rematerializable?
158281a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    MachineInstr *ReMatDefMI = (DefIdx == ~0u)
158381a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      ? 0 : getInstructionFromIndex(DefIdx);
15845ef3a04b542c4e585276768fa9ca2af698ef5c87Evan Cheng    bool dummy;
15855ef3a04b542c4e585276768fa9ca2af698ef5c87Evan Cheng    if (ReMatDefMI && isReMaterializable(li, VNI, ReMatDefMI, dummy)) {
1586f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      // Remember how to remat the def of this val#.
158781a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      ReMatOrigDefs[VN] = ReMatDefMI;
1588f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      // Original def may be modified so we have to make a copy here. vrm must
1589f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      // delete these!
15908e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman      ReMatDefs[VN] = ReMatDefMI = mf_->CloneMachineInstr(ReMatDefMI);
1591f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng
1592f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      bool CanDelete = true;
1593c3fc7d9ec9b495c8a88cd854247105c296d3aabdEvan Cheng      if (VNI->hasPHIKill) {
1594c3fc7d9ec9b495c8a88cd854247105c296d3aabdEvan Cheng        // A kill is a phi node, not all of its uses can be rematerialized.
1595f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng        // It must not be deleted.
1596c3fc7d9ec9b495c8a88cd854247105c296d3aabdEvan Cheng        CanDelete = false;
1597c3fc7d9ec9b495c8a88cd854247105c296d3aabdEvan Cheng        // Need a stack slot if there is any live range where uses cannot be
1598c3fc7d9ec9b495c8a88cd854247105c296d3aabdEvan Cheng        // rematerialized.
1599c3fc7d9ec9b495c8a88cd854247105c296d3aabdEvan Cheng        NeedStackSlot = true;
1600f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      }
1601f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      if (CanDelete)
1602f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng        ReMatDelete.set(VN);
1603f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    } else {
1604f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      // Need a stack slot if there is any live range where uses cannot be
1605f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      // rematerialized.
1606f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng      NeedStackSlot = true;
1607f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    }
1608f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  }
1609f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng
1610f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  // One stack slot per live interval.
161181a038218171860ee4c382849c647d3dc841fe8bEvan Cheng  if (NeedStackSlot && vrm.getPreSplitReg(li.reg) == 0)
1612f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    Slot = vrm.assignVirt2StackSlot(li.reg);
1613f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng
1614f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  // Create new intervals and rewrite defs and uses.
1615f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  for (LiveInterval::Ranges::const_iterator
1616f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng         I = li.ranges.begin(), E = li.ranges.end(); I != E; ++I) {
161781a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    MachineInstr *ReMatDefMI = ReMatDefs[I->valno->id];
161881a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    MachineInstr *ReMatOrigDefMI = ReMatOrigDefs[I->valno->id];
161981a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    bool DefIsReMat = ReMatDefMI != NULL;
1620f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    bool CanDelete = ReMatDelete[I->valno->id];
1621f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    int LdSlot = 0;
162281a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    bool isLoadSS = DefIsReMat && tii_->isLoadFromStackSlot(ReMatDefMI, LdSlot);
1623f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng    bool isLoad = isLoadSS ||
1624749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattner      (DefIsReMat && ReMatDefMI->getDesc().isSimpleLoad());
162581a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    rewriteInstructionsForSpills(li, TrySplit, I, ReMatOrigDefMI, ReMatDefMI,
16260cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng                               Slot, LdSlot, isLoad, isLoadSS, DefIsReMat,
1627d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng                               CanDelete, vrm, rc, ReMatIds, loopInfo,
16280cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng                               SpillMBBs, SpillIdxes, RestoreMBBs, RestoreIdxes,
16299c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng                               MBBVRegsMap, NewLIs, SSWeight);
1630f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng  }
1631f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng
16320cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng  // Insert spills / restores if we are splitting.
1633419852ca8a01aecde4c0e20af6b7bd6450e70f87Evan Cheng  if (!TrySplit) {
16344cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng    handleSpilledImpDefs(li, vrm, rc, NewLIs);
16351953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng    return NewLIs;
1636419852ca8a01aecde4c0e20af6b7bd6450e70f87Evan Cheng  }
16371953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng
1638b50bb8cf197709b3f49044740044c06d8f314564Evan Cheng  SmallPtrSet<LiveInterval*, 4> AddedKill;
1639aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng  SmallVector<unsigned, 2> Ops;
16401953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng  if (NeedStackSlot) {
16411953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng    int Id = SpillMBBs.find_first();
16421953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng    while (Id != -1) {
16439c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng      MachineBasicBlock *MBB = mf_->getBlockNumbered(Id);
16449c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng      unsigned loopDepth = loopInfo->getLoopDepth(MBB);
16451953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng      std::vector<SRInfo> &spills = SpillIdxes[Id];
16461953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng      for (unsigned i = 0, e = spills.size(); i != e; ++i) {
16471953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng        int index = spills[i].index;
16481953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng        unsigned VReg = spills[i].vreg;
1649597d10d84fb6b34f7776121404d5ed802b21b2b6Evan Cheng        LiveInterval &nI = getOrCreateInterval(VReg);
16500cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng        bool isReMat = vrm.isReMaterialized(VReg);
16510cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng        MachineInstr *MI = getInstructionFromIndex(index);
1652aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng        bool CanFold = false;
1653aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng        bool FoundUse = false;
1654aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng        Ops.clear();
1655cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng        if (spills[i].canFold) {
1656aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng          CanFold = true;
16570cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng          for (unsigned j = 0, ee = MI->getNumOperands(); j != ee; ++j) {
16580cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng            MachineOperand &MO = MI->getOperand(j);
16590cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng            if (!MO.isRegister() || MO.getReg() != VReg)
16600cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng              continue;
1661aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng
1662aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng            Ops.push_back(j);
1663aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng            if (MO.isDef())
1664cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng              continue;
1665aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng            if (isReMat ||
1666aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng                (!FoundUse && !alsoFoldARestore(Id, index, VReg,
1667aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng                                                RestoreMBBs, RestoreIdxes))) {
1668aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng              // MI has two-address uses of the same register. If the use
1669aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng              // isn't the first and only use in the BB, then we can't fold
1670aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng              // it. FIXME: Move this to rewriteInstructionsForSpills.
1671aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng              CanFold = false;
1672cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng              break;
1673cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng            }
1674aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng            FoundUse = true;
16750cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng          }
16760cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng        }
16770cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng        // Fold the store into the def if possible.
1678cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng        bool Folded = false;
1679aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng        if (CanFold && !Ops.empty()) {
1680aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng          if (tryFoldMemoryOperand(MI, vrm, NULL, index, Ops, true, Slot,VReg)){
1681cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng            Folded = true;
1682f38d14f03e495ea98ae16bda6febbde276513294Evan Cheng            if (FoundUse > 0) {
1683aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng              // Also folded uses, do not issue a load.
1684aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng              eraseRestoreInfo(Id, index, VReg, RestoreMBBs, RestoreIdxes);
1685f38d14f03e495ea98ae16bda6febbde276513294Evan Cheng              nI.removeRange(getLoadIndex(index), getUseIndex(index)+1);
1686f38d14f03e495ea98ae16bda6febbde276513294Evan Cheng            }
1687597d10d84fb6b34f7776121404d5ed802b21b2b6Evan Cheng            nI.removeRange(getDefIndex(index), getStoreIndex(index));
1688cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng          }
16890cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng        }
16900cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng
16917e073baedb8232b9519dbe15ea141ff98ccfe6aeEvan Cheng        // Otherwise tell the spiller to issue a spill.
1692b50bb8cf197709b3f49044740044c06d8f314564Evan Cheng        if (!Folded) {
1693b50bb8cf197709b3f49044740044c06d8f314564Evan Cheng          LiveRange *LR = &nI.ranges[nI.ranges.size()-1];
1694b50bb8cf197709b3f49044740044c06d8f314564Evan Cheng          bool isKill = LR->end == getStoreIndex(index);
1695b0a6f62c9b2e75fc509d84310a9795ffacbc6796Evan Cheng          if (!MI->registerDefIsDead(nI.reg))
1696b0a6f62c9b2e75fc509d84310a9795ffacbc6796Evan Cheng            // No need to spill a dead def.
1697b0a6f62c9b2e75fc509d84310a9795ffacbc6796Evan Cheng            vrm.addSpillPoint(VReg, isKill, MI);
1698b50bb8cf197709b3f49044740044c06d8f314564Evan Cheng          if (isKill)
1699b50bb8cf197709b3f49044740044c06d8f314564Evan Cheng            AddedKill.insert(&nI);
1700b50bb8cf197709b3f49044740044c06d8f314564Evan Cheng        }
17019c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng
17029c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng        // Update spill slot weight.
17039c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng        if (!isReMat)
1704c3417609ae6e744a29be6962d4fb7811c0102d17Evan Cheng          SSWeight += getSpillWeight(true, false, loopDepth);
17050cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng      }
17061953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng      Id = SpillMBBs.find_next(Id);
17070cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng    }
17081953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng  }
17090cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng
17101953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng  int Id = RestoreMBBs.find_first();
17111953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng  while (Id != -1) {
17129c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng    MachineBasicBlock *MBB = mf_->getBlockNumbered(Id);
17139c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng    unsigned loopDepth = loopInfo->getLoopDepth(MBB);
17149c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng
17151953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng    std::vector<SRInfo> &restores = RestoreIdxes[Id];
17161953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng    for (unsigned i = 0, e = restores.size(); i != e; ++i) {
17171953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng      int index = restores[i].index;
17181953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng      if (index == -1)
17191953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng        continue;
17201953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng      unsigned VReg = restores[i].vreg;
1721597d10d84fb6b34f7776121404d5ed802b21b2b6Evan Cheng      LiveInterval &nI = getOrCreateInterval(VReg);
17229c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng      bool isReMat = vrm.isReMaterialized(VReg);
172381a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      MachineInstr *MI = getInstructionFromIndex(index);
1724aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng      bool CanFold = false;
1725aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng      Ops.clear();
1726cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng      if (restores[i].canFold) {
1727aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng        CanFold = true;
172881a038218171860ee4c382849c647d3dc841fe8bEvan Cheng        for (unsigned j = 0, ee = MI->getNumOperands(); j != ee; ++j) {
172981a038218171860ee4c382849c647d3dc841fe8bEvan Cheng          MachineOperand &MO = MI->getOperand(j);
173081a038218171860ee4c382849c647d3dc841fe8bEvan Cheng          if (!MO.isRegister() || MO.getReg() != VReg)
173181a038218171860ee4c382849c647d3dc841fe8bEvan Cheng            continue;
1732aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng
17330cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng          if (MO.isDef()) {
1734aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng            // If this restore were to be folded, it would have been folded
1735aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng            // already.
1736aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng            CanFold = false;
173781a038218171860ee4c382849c647d3dc841fe8bEvan Cheng            break;
173881a038218171860ee4c382849c647d3dc841fe8bEvan Cheng          }
1739aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng          Ops.push_back(j);
174081a038218171860ee4c382849c647d3dc841fe8bEvan Cheng        }
174181a038218171860ee4c382849c647d3dc841fe8bEvan Cheng      }
17420cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng
17430cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng      // Fold the load into the use if possible.
1744cddbb83ea82e98658d9f530c50a7b9d23249afc2Evan Cheng      bool Folded = false;
1745aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng      if (CanFold && !Ops.empty()) {
17469c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng        if (!isReMat)
1747aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng          Folded = tryFoldMemoryOperand(MI, vrm, NULL,index,Ops,true,Slot,VReg);
1748aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng        else {
17490cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng          MachineInstr *ReMatDefMI = vrm.getReMaterializedMI(VReg);
17500cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng          int LdSlot = 0;
17510cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng          bool isLoadSS = tii_->isLoadFromStackSlot(ReMatDefMI, LdSlot);
17520cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng          // If the rematerializable def is a load, also try to fold it.
1753749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattner          if (isLoadSS || ReMatDefMI->getDesc().isSimpleLoad())
1754aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng            Folded = tryFoldMemoryOperand(MI, vrm, ReMatDefMI, index,
1755aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng                                          Ops, isLoadSS, LdSlot, VReg);
1756d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng          unsigned ImpUse = getReMatImplicitUse(li, ReMatDefMI);
1757d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng          if (ImpUse) {
1758d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng            // Re-matting an instruction with virtual register use. Add the
1759d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng            // register as an implicit use on the use MI and update the register
176024d2f8a212f08bf21360122cc00acf2657af91f9Evan Cheng            // interval's spill weight to HUGE_VALF to prevent it from being
176124d2f8a212f08bf21360122cc00acf2657af91f9Evan Cheng            // spilled.
1762d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng            LiveInterval &ImpLi = getInterval(ImpUse);
176324d2f8a212f08bf21360122cc00acf2657af91f9Evan Cheng            ImpLi.weight = HUGE_VALF;
1764d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng            MI->addOperand(MachineOperand::CreateReg(ImpUse, false, true));
1765d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng          }
1766aee4af68ae2016afc5b4ec0c430e539c5810a766Evan Cheng        }
17670cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng      }
17680cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng      // If folding is not possible / failed, then tell the spiller to issue a
17690cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng      // load / rematerialization for us.
1770597d10d84fb6b34f7776121404d5ed802b21b2b6Evan Cheng      if (Folded)
1771597d10d84fb6b34f7776121404d5ed802b21b2b6Evan Cheng        nI.removeRange(getLoadIndex(index), getUseIndex(index)+1);
1772b50bb8cf197709b3f49044740044c06d8f314564Evan Cheng      else
17730cbb1164b3227f25f5e5d3681800a8e50e6b9865Evan Cheng        vrm.addRestorePoint(VReg, MI);
17749c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng
17759c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng      // Update spill slot weight.
17769c3c2213647e3f1b71722d61875ebac01b65cb91Evan Cheng      if (!isReMat)
1777c3417609ae6e744a29be6962d4fb7811c0102d17Evan Cheng        SSWeight += getSpillWeight(false, true, loopDepth);
177881a038218171860ee4c382849c647d3dc841fe8bEvan Cheng    }
17791953d0cb7d6d27da3ad067468a7ad6dd7c4fa46eEvan Cheng    Id = RestoreMBBs.find_next(Id);
178081a038218171860ee4c382849c647d3dc841fe8bEvan Cheng  }
178181a038218171860ee4c382849c647d3dc841fe8bEvan Cheng
1782b50bb8cf197709b3f49044740044c06d8f314564Evan Cheng  // Finalize intervals: add kills, finalize spill weights, and filter out
1783b50bb8cf197709b3f49044740044c06d8f314564Evan Cheng  // dead intervals.
1784597d10d84fb6b34f7776121404d5ed802b21b2b6Evan Cheng  std::vector<LiveInterval*> RetNewLIs;
1785597d10d84fb6b34f7776121404d5ed802b21b2b6Evan Cheng  for (unsigned i = 0, e = NewLIs.size(); i != e; ++i) {
1786597d10d84fb6b34f7776121404d5ed802b21b2b6Evan Cheng    LiveInterval *LI = NewLIs[i];
1787597d10d84fb6b34f7776121404d5ed802b21b2b6Evan Cheng    if (!LI->empty()) {
1788597d10d84fb6b34f7776121404d5ed802b21b2b6Evan Cheng      LI->weight /= LI->getSize();
1789b50bb8cf197709b3f49044740044c06d8f314564Evan Cheng      if (!AddedKill.count(LI)) {
1790b50bb8cf197709b3f49044740044c06d8f314564Evan Cheng        LiveRange *LR = &LI->ranges[LI->ranges.size()-1];
1791d120ffd26f2715c600b028d4eac9a3c41a9f4653Evan Cheng        unsigned LastUseIdx = getBaseIndex(LR->end);
1792d120ffd26f2715c600b028d4eac9a3c41a9f4653Evan Cheng        MachineInstr *LastUse = getInstructionFromIndex(LastUseIdx);
17936130f66eaae89f8878590796977678afa8448926Evan Cheng        int UseIdx = LastUse->findRegisterUseOperandIdx(LI->reg, false);
1794b50bb8cf197709b3f49044740044c06d8f314564Evan Cheng        assert(UseIdx != -1);
1795d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng        if (LastUse->getOperand(UseIdx).isImplicit() ||
1796d70dbb5d627a0408eccf88033143efa62ee0e6c0Evan Cheng            LastUse->getDesc().getOperandConstraint(UseIdx,TOI::TIED_TO) == -1){
1797b50bb8cf197709b3f49044740044c06d8f314564Evan Cheng          LastUse->getOperand(UseIdx).setIsKill();
1798d120ffd26f2715c600b028d4eac9a3c41a9f4653Evan Cheng          vrm.addKillPoint(LI->reg, LastUseIdx);
1799adf85906906ebf85c57c333e8209f37ef11a6c99Evan Cheng        }
1800b50bb8cf197709b3f49044740044c06d8f314564Evan Cheng      }
1801597d10d84fb6b34f7776121404d5ed802b21b2b6Evan Cheng      RetNewLIs.push_back(LI);
1802597d10d84fb6b34f7776121404d5ed802b21b2b6Evan Cheng    }
1803597d10d84fb6b34f7776121404d5ed802b21b2b6Evan Cheng  }
180481a038218171860ee4c382849c647d3dc841fe8bEvan Cheng
18054cce6b4c7882ef0cc993d931b90bf33985c96110Evan Cheng  handleSpilledImpDefs(li, vrm, rc, RetNewLIs);
1806597d10d84fb6b34f7776121404d5ed802b21b2b6Evan Cheng  return RetNewLIs;
1807f2fbca68f868122d6df0bfc9952b4e4c3dfb60b7Evan Cheng}
1808676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng
1809676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng/// hasAllocatableSuperReg - Return true if the specified physical register has
1810676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng/// any super register that's allocatable.
1811676dd7c80b6f91178452535ac45ca58feb23cc42Evan Chengbool LiveIntervals::hasAllocatableSuperReg(unsigned Reg) const {
1812676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng  for (const unsigned* AS = tri_->getSuperRegisters(Reg); *AS; ++AS)
1813676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng    if (allocatableRegs_[*AS] && hasInterval(*AS))
1814676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng      return true;
1815676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng  return false;
1816676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng}
1817676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng
1818676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng/// getRepresentativeReg - Find the largest super register of the specified
1819676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng/// physical register.
1820676dd7c80b6f91178452535ac45ca58feb23cc42Evan Chengunsigned LiveIntervals::getRepresentativeReg(unsigned Reg) const {
1821676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng  // Find the largest super-register that is allocatable.
1822676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng  unsigned BestReg = Reg;
1823676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng  for (const unsigned* AS = tri_->getSuperRegisters(Reg); *AS; ++AS) {
1824676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng    unsigned SuperReg = *AS;
1825676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng    if (!hasAllocatableSuperReg(SuperReg) && hasInterval(SuperReg)) {
1826676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng      BestReg = SuperReg;
1827676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng      break;
1828676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng    }
1829676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng  }
1830676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng  return BestReg;
1831676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng}
1832676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng
1833676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng/// getNumConflictsWithPhysReg - Return the number of uses and defs of the
1834676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng/// specified interval that conflicts with the specified physical register.
1835676dd7c80b6f91178452535ac45ca58feb23cc42Evan Chengunsigned LiveIntervals::getNumConflictsWithPhysReg(const LiveInterval &li,
1836676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng                                                   unsigned PhysReg) const {
1837676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng  unsigned NumConflicts = 0;
1838676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng  const LiveInterval &pli = getInterval(getRepresentativeReg(PhysReg));
1839676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng  for (MachineRegisterInfo::reg_iterator I = mri_->reg_begin(li.reg),
1840676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng         E = mri_->reg_end(); I != E; ++I) {
1841676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng    MachineOperand &O = I.getOperand();
1842676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng    MachineInstr *MI = O.getParent();
1843676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng    unsigned Index = getInstructionIndex(MI);
1844676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng    if (pli.liveAt(Index))
1845676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng      ++NumConflicts;
1846676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng  }
1847676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng  return NumConflicts;
1848676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng}
1849676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng
1850676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng/// spillPhysRegAroundRegDefsUses - Spill the specified physical register
1851676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng/// around all defs and uses of the specified interval.
1852676dd7c80b6f91178452535ac45ca58feb23cc42Evan Chengvoid LiveIntervals::spillPhysRegAroundRegDefsUses(const LiveInterval &li,
1853676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng                                            unsigned PhysReg, VirtRegMap &vrm) {
1854676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng  unsigned SpillReg = getRepresentativeReg(PhysReg);
1855676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng
1856676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng  for (const unsigned *AS = tri_->getAliasSet(PhysReg); *AS; ++AS)
1857676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng    // If there are registers which alias PhysReg, but which are not a
1858676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng    // sub-register of the chosen representative super register. Assert
1859676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng    // since we can't handle it yet.
1860676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng    assert(*AS == SpillReg || !allocatableRegs_[*AS] ||
1861676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng           tri_->isSuperRegister(*AS, SpillReg));
1862676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng
1863676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng  LiveInterval &pli = getInterval(SpillReg);
1864676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng  SmallPtrSet<MachineInstr*, 8> SeenMIs;
1865676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng  for (MachineRegisterInfo::reg_iterator I = mri_->reg_begin(li.reg),
1866676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng         E = mri_->reg_end(); I != E; ++I) {
1867676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng    MachineOperand &O = I.getOperand();
1868676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng    MachineInstr *MI = O.getParent();
1869676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng    if (SeenMIs.count(MI))
1870676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng      continue;
1871676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng    SeenMIs.insert(MI);
1872676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng    unsigned Index = getInstructionIndex(MI);
1873676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng    if (pli.liveAt(Index)) {
1874676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng      vrm.addEmergencySpill(SpillReg, MI);
1875676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng      pli.removeRange(getLoadIndex(Index), getStoreIndex(Index)+1);
1876676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng      for (const unsigned* AS = tri_->getSubRegisters(SpillReg); *AS; ++AS) {
1877676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng        if (!hasInterval(*AS))
1878676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng          continue;
1879676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng        LiveInterval &spli = getInterval(*AS);
1880676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng        if (spli.liveAt(Index))
1881676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng          spli.removeRange(getLoadIndex(Index), getStoreIndex(Index)+1);
1882676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng      }
1883676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng    }
1884676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng  }
1885676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng}
1886c4dc132c8a787fc41b6a162121251234aa618965Owen Anderson
1887c4dc132c8a787fc41b6a162121251234aa618965Owen AndersonLiveRange LiveIntervals::addLiveRangeToEndOfBlock(unsigned reg,
1888c4dc132c8a787fc41b6a162121251234aa618965Owen Anderson                                                   MachineInstr* startInst) {
1889c4dc132c8a787fc41b6a162121251234aa618965Owen Anderson  LiveInterval& Interval = getOrCreateInterval(reg);
1890c4dc132c8a787fc41b6a162121251234aa618965Owen Anderson  VNInfo* VN = Interval.getNextValue(
1891c4dc132c8a787fc41b6a162121251234aa618965Owen Anderson            getInstructionIndex(startInst) + InstrSlots::DEF,
1892c4dc132c8a787fc41b6a162121251234aa618965Owen Anderson            startInst, getVNInfoAllocator());
1893c4dc132c8a787fc41b6a162121251234aa618965Owen Anderson  VN->hasPHIKill = true;
1894c4dc132c8a787fc41b6a162121251234aa618965Owen Anderson  VN->kills.push_back(getMBBEndIdx(startInst->getParent()));
1895c4dc132c8a787fc41b6a162121251234aa618965Owen Anderson  LiveRange LR(getInstructionIndex(startInst) + InstrSlots::DEF,
1896c4dc132c8a787fc41b6a162121251234aa618965Owen Anderson               getMBBEndIdx(startInst->getParent()) + 1, VN);
1897c4dc132c8a787fc41b6a162121251234aa618965Owen Anderson  Interval.addRange(LR);
1898c4dc132c8a787fc41b6a162121251234aa618965Owen Anderson
1899c4dc132c8a787fc41b6a162121251234aa618965Owen Anderson  return LR;
1900c4dc132c8a787fc41b6a162121251234aa618965Owen Anderson}
1901