RegAllocFast.cpp revision bab24216cc77477d475e9d2ae18e275c5b2054a3
100207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen//===-- RegAllocFast.cpp - A fast register allocator for debug code -------===//
200207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen//
300207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen//                     The LLVM Compiler Infrastructure
400207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen//
500207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen// This file is distributed under the University of Illinois Open Source
600207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen// License. See LICENSE.TXT for details.
700207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen//
800207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen//===----------------------------------------------------------------------===//
900207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen//
1000207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen// This register allocator allocates registers to a basic block at a time,
1100207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen// attempting to keep values in registers and reusing registers as appropriate.
1200207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen//
1300207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen//===----------------------------------------------------------------------===//
1400207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
1500207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen#define DEBUG_TYPE "regalloc"
1600207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen#include "llvm/BasicBlock.h"
1700207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen#include "llvm/CodeGen/MachineFunctionPass.h"
1800207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen#include "llvm/CodeGen/MachineInstr.h"
19459a36bd34809ffc5d74de79b3e46f6e02e5184fDevang Patel#include "llvm/CodeGen/MachineInstrBuilder.h"
2000207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen#include "llvm/CodeGen/MachineFrameInfo.h"
2100207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen#include "llvm/CodeGen/MachineRegisterInfo.h"
2200207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen#include "llvm/CodeGen/Passes.h"
2300207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen#include "llvm/CodeGen/RegAllocRegistry.h"
241525260b3e50cc578939ef41b60609689eecfdd2Andrew Trick#include "llvm/CodeGen/RegisterClassInfo.h"
2500207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen#include "llvm/Target/TargetInstrInfo.h"
2600207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen#include "llvm/Target/TargetMachine.h"
2700207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen#include "llvm/Support/CommandLine.h"
2800207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen#include "llvm/Support/Debug.h"
2900207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen#include "llvm/Support/ErrorHandling.h"
3000207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen#include "llvm/Support/raw_ostream.h"
3100207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen#include "llvm/ADT/DenseMap.h"
3200207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen#include "llvm/ADT/IndexedMap.h"
3300207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen#include "llvm/ADT/SmallSet.h"
3400207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen#include "llvm/ADT/SmallVector.h"
35a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen#include "llvm/ADT/SparseSet.h"
3600207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen#include "llvm/ADT/Statistic.h"
3700207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen#include "llvm/ADT/STLExtras.h"
3800207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen#include <algorithm>
3900207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesenusing namespace llvm;
4000207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
4100207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund OlesenSTATISTIC(NumStores, "Number of stores added");
4200207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund OlesenSTATISTIC(NumLoads , "Number of loads added");
438a65c510a4fa1245d101da6318618d025702028cJakob Stoklund OlesenSTATISTIC(NumCopies, "Number of copies coalesced");
4400207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
4500207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesenstatic RegisterRegAlloc
4600207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  fastRegAlloc("fast", "fast register allocator", createFastRegisterAllocator);
4700207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
4800207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesennamespace {
4900207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  class RAFast : public MachineFunctionPass {
5000207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  public:
5100207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen    static char ID;
5290c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson    RAFast() : MachineFunctionPass(ID), StackSlotForVirtReg(-1),
538dd26253f54247e77e5accfdd70e7b4bf27b39c2Andrew Trick               isBulkSpilling(false) {}
5400207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  private:
5500207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen    const TargetMachine *TM;
5600207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen    MachineFunction *MF;
574bf4bafcced902ee6d58a90486768f08a3795d02Jakob Stoklund Olesen    MachineRegisterInfo *MRI;
5800207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen    const TargetRegisterInfo *TRI;
5900207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen    const TargetInstrInfo *TII;
605d20c3152bd7fe91eda1b58a5eb6da7067874c61Jakob Stoklund Olesen    RegisterClassInfo RegClassInfo;
6100207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
626fb69d85e9576445e98c4114ee7064deb4476712Jakob Stoklund Olesen    // Basic block currently being allocated.
636fb69d85e9576445e98c4114ee7064deb4476712Jakob Stoklund Olesen    MachineBasicBlock *MBB;
646fb69d85e9576445e98c4114ee7064deb4476712Jakob Stoklund Olesen
6500207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen    // StackSlotForVirtReg - Maps virtual regs to the frame index where these
6600207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen    // values are spilled.
6700207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen    IndexedMap<int, VirtReg2IndexFunctor> StackSlotForVirtReg;
6800207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
6976b4d5a0210f161c08543f00f355955c94d3f2ecJakob Stoklund Olesen    // Everything we know about a live virtual register.
7076b4d5a0210f161c08543f00f355955c94d3f2ecJakob Stoklund Olesen    struct LiveReg {
71210e2afcc74e8ce5102d13939b23040fafa71c09Jakob Stoklund Olesen      MachineInstr *LastUse;    // Last instr to use reg.
72a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen      unsigned VirtReg;         // Virtual register number.
73210e2afcc74e8ce5102d13939b23040fafa71c09Jakob Stoklund Olesen      unsigned PhysReg;         // Currently held here.
74210e2afcc74e8ce5102d13939b23040fafa71c09Jakob Stoklund Olesen      unsigned short LastOpNum; // OpNum on LastUse.
75210e2afcc74e8ce5102d13939b23040fafa71c09Jakob Stoklund Olesen      bool Dirty;               // Register needs spill.
7676b4d5a0210f161c08543f00f355955c94d3f2ecJakob Stoklund Olesen
77a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen      explicit LiveReg(unsigned v)
78a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen        : LastUse(0), VirtReg(v), PhysReg(0), LastOpNum(0), Dirty(false) {}
79a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen
80c0ccb8bb17028fe0dda139c0972c0125d10e6053Andrew Trick      unsigned getSparseSetIndex() const {
81a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen        return TargetRegisterInfo::virtReg2Index(VirtReg);
82a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen      }
8376b4d5a0210f161c08543f00f355955c94d3f2ecJakob Stoklund Olesen    };
8476b4d5a0210f161c08543f00f355955c94d3f2ecJakob Stoklund Olesen
85a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    typedef SparseSet<LiveReg> LiveRegMap;
8676b4d5a0210f161c08543f00f355955c94d3f2ecJakob Stoklund Olesen
8776b4d5a0210f161c08543f00f355955c94d3f2ecJakob Stoklund Olesen    // LiveVirtRegs - This map contains entries for each virtual register
8800207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen    // that is currently available in a physical register.
8976b4d5a0210f161c08543f00f355955c94d3f2ecJakob Stoklund Olesen    LiveRegMap LiveVirtRegs;
9000207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
9172d9b0e4fce90a635af5c80cb6992ac639279d59Devang Patel    DenseMap<unsigned, SmallVector<MachineInstr *, 4> > LiveDbgValueMap;
92459a36bd34809ffc5d74de79b3e46f6e02e5184fDevang Patel
93bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    // RegState - Track the state of a physical register.
94bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    enum RegState {
95bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      // A disabled register is not available for allocation, but an alias may
96bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      // be in use. A register can only be moved out of the disabled state if
97bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      // all aliases are disabled.
98bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      regDisabled,
99bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen
100bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      // A free register is not currently in use and can be allocated
101bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      // immediately without checking aliases.
102bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      regFree,
103bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen
104d8a16241229a6d3f761e2e9fd19cbe08e614f113Evan Cheng      // A reserved register has been assigned explicitly (e.g., setting up a
105bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      // call parameter), and it remains reserved until it is used.
106bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      regReserved
10700207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
108bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      // A register state may also be a virtual register number, indication that
109bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      // the physical register is currently allocated to a virtual register. In
11076b4d5a0210f161c08543f00f355955c94d3f2ecJakob Stoklund Olesen      // that case, LiveVirtRegs contains the inverse mapping.
111bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    };
112bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen
113bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    // PhysRegState - One of the RegState enums, or a virtreg.
114bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    std::vector<unsigned> PhysRegState;
11500207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
116d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen    typedef SparseSet<unsigned> UsedInInstrSet;
117d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen
118d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen    // UsedInInstr - Set of physregs that are used in the current instruction,
119d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen    // and so cannot be allocated.
120d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen    UsedInInstrSet UsedInInstr;
12100207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
12207cb689d6260b78861d829bb05b188e1558c528eJim Grosbach    // SkippedInstrs - Descriptors of instructions whose clobber list was
12307cb689d6260b78861d829bb05b188e1558c528eJim Grosbach    // ignored because all registers were spilled. It is still necessary to
12407cb689d6260b78861d829bb05b188e1558c528eJim Grosbach    // mark all the clobbered registers as used by the function.
125e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng    SmallPtrSet<const MCInstrDesc*, 4> SkippedInstrs;
1266de07178e1e6445080bf4f7704e274c5f219ff70Jakob Stoklund Olesen
127e6aba837974f7d2539efad9a09fe06b4d1566e5dJakob Stoklund Olesen    // isBulkSpilling - This flag is set when LiveRegMap will be cleared
128e6aba837974f7d2539efad9a09fe06b4d1566e5dJakob Stoklund Olesen    // completely after spilling all live registers. LiveRegMap entries should
129e6aba837974f7d2539efad9a09fe06b4d1566e5dJakob Stoklund Olesen    // not be erased.
130e6aba837974f7d2539efad9a09fe06b4d1566e5dJakob Stoklund Olesen    bool isBulkSpilling;
1317d4f25904de543b039a28eddbea3034a5d80e7f8Jakob Stoklund Olesen
132548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen    enum {
133548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen      spillClean = 1,
134548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen      spillDirty = 100,
135548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen      spillImpossible = ~0u
136548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen    };
13700207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  public:
13800207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen    virtual const char *getPassName() const {
13900207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen      return "Fast Register Allocator";
14000207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen    }
14100207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
14200207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
14300207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen      AU.setPreservesCFG();
14400207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen      MachineFunctionPass::getAnalysisUsage(AU);
14500207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen    }
14600207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
14700207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  private:
14800207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen    bool runOnMachineFunction(MachineFunction &Fn);
1496fb69d85e9576445e98c4114ee7064deb4476712Jakob Stoklund Olesen    void AllocateBasicBlock();
150d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    void handleThroughOperands(MachineInstr *MI,
151d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen                               SmallVectorImpl<unsigned> &VirtDead);
15200207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen    int getStackSpaceFor(unsigned VirtReg, const TargetRegisterClass *RC);
1531e03ff42433afe3a9ffad2765b537f10db3aa921Jakob Stoklund Olesen    bool isLastUseOfLocalReg(MachineOperand&);
1541e03ff42433afe3a9ffad2765b537f10db3aa921Jakob Stoklund Olesen
15501dcbf850732790fe7d5b5ed23426d535b07f316Jakob Stoklund Olesen    void addKillFlag(const LiveReg&);
156844db9cc6f1a9458b60b8debeef3132f555dcd8fJakob Stoklund Olesen    void killVirtReg(LiveRegMap::iterator);
157804291e31658d46fb1db5ecaf42b31950c02a6f2Jakob Stoklund Olesen    void killVirtReg(unsigned VirtReg);
158844db9cc6f1a9458b60b8debeef3132f555dcd8fJakob Stoklund Olesen    void spillVirtReg(MachineBasicBlock::iterator MI, LiveRegMap::iterator);
159e6aba837974f7d2539efad9a09fe06b4d1566e5dJakob Stoklund Olesen    void spillVirtReg(MachineBasicBlock::iterator MI, unsigned VirtReg);
1604ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen
1614ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen    void usePhysReg(MachineOperand&);
1626fb69d85e9576445e98c4114ee7064deb4476712Jakob Stoklund Olesen    void definePhysReg(MachineInstr *MI, unsigned PhysReg, RegState NewState);
163548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen    unsigned calcSpillCost(unsigned PhysReg) const;
164a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    void assignVirtToPhysReg(LiveReg&, unsigned PhysReg);
165a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    LiveRegMap::iterator findLiveVirtReg(unsigned VirtReg) {
166a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen      return LiveVirtRegs.find(TargetRegisterInfo::virtReg2Index(VirtReg));
167a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    }
168a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    LiveRegMap::const_iterator findLiveVirtReg(unsigned VirtReg) const {
169a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen      return LiveVirtRegs.find(TargetRegisterInfo::virtReg2Index(VirtReg));
170a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    }
171a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    LiveRegMap::iterator assignVirtToPhysReg(unsigned VReg, unsigned PhysReg);
172a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    LiveRegMap::iterator allocVirtReg(MachineInstr *MI, LiveRegMap::iterator,
173a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen                                      unsigned Hint);
174646dd7c899ea213301e193a25536a4bceebf7937Jakob Stoklund Olesen    LiveRegMap::iterator defineVirtReg(MachineInstr *MI, unsigned OpNum,
175646dd7c899ea213301e193a25536a4bceebf7937Jakob Stoklund Olesen                                       unsigned VirtReg, unsigned Hint);
176646dd7c899ea213301e193a25536a4bceebf7937Jakob Stoklund Olesen    LiveRegMap::iterator reloadVirtReg(MachineInstr *MI, unsigned OpNum,
177646dd7c899ea213301e193a25536a4bceebf7937Jakob Stoklund Olesen                                       unsigned VirtReg, unsigned Hint);
178bab24216cc77477d475e9d2ae18e275c5b2054a3Akira Hatanaka    void spillAll(MachineBasicBlock::iterator MI);
1790eeb05c969c6c314ca7991a10627451762787e2dJakob Stoklund Olesen    bool setPhysReg(MachineInstr *MI, unsigned OpNum, unsigned PhysReg);
180b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick    void addRetOperands(MachineBasicBlock *MBB);
18100207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  };
18200207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  char RAFast::ID = 0;
18300207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen}
18400207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
18500207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen/// getStackSpaceFor - This allocates space for the specified virtual register
18600207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen/// to be held on the stack.
18700207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesenint RAFast::getStackSpaceFor(unsigned VirtReg, const TargetRegisterClass *RC) {
18800207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  // Find the location Reg would belong...
18900207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  int SS = StackSlotForVirtReg[VirtReg];
19000207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  if (SS != -1)
19100207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen    return SS;          // Already has space allocated?
19200207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
19300207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  // Allocate a new stack object for this spill location...
19400207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  int FrameIdx = MF->getFrameInfo()->CreateSpillStackObject(RC->getSize(),
19500207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen                                                            RC->getAlignment());
19600207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
19700207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  // Assign the slot.
19800207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  StackSlotForVirtReg[VirtReg] = FrameIdx;
19900207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  return FrameIdx;
20000207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen}
20100207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
2021e03ff42433afe3a9ffad2765b537f10db3aa921Jakob Stoklund Olesen/// isLastUseOfLocalReg - Return true if MO is the only remaining reference to
2031e03ff42433afe3a9ffad2765b537f10db3aa921Jakob Stoklund Olesen/// its virtual register, and it is guaranteed to be a block-local register.
2041e03ff42433afe3a9ffad2765b537f10db3aa921Jakob Stoklund Olesen///
2051e03ff42433afe3a9ffad2765b537f10db3aa921Jakob Stoklund Olesenbool RAFast::isLastUseOfLocalReg(MachineOperand &MO) {
2061e03ff42433afe3a9ffad2765b537f10db3aa921Jakob Stoklund Olesen  // If the register has ever been spilled or reloaded, we conservatively assume
2071e03ff42433afe3a9ffad2765b537f10db3aa921Jakob Stoklund Olesen  // it is a global register used in multiple blocks.
2081e03ff42433afe3a9ffad2765b537f10db3aa921Jakob Stoklund Olesen  if (StackSlotForVirtReg[MO.getReg()] != -1)
2091e03ff42433afe3a9ffad2765b537f10db3aa921Jakob Stoklund Olesen    return false;
2101e03ff42433afe3a9ffad2765b537f10db3aa921Jakob Stoklund Olesen
2111e03ff42433afe3a9ffad2765b537f10db3aa921Jakob Stoklund Olesen  // Check that the use/def chain has exactly one operand - MO.
2124e6966266a6dbbd560e11f68e6a5ff3fd35c130dJakob Stoklund Olesen  MachineRegisterInfo::reg_nodbg_iterator I = MRI->reg_nodbg_begin(MO.getReg());
2134e6966266a6dbbd560e11f68e6a5ff3fd35c130dJakob Stoklund Olesen  if (&I.getOperand() != &MO)
2144e6966266a6dbbd560e11f68e6a5ff3fd35c130dJakob Stoklund Olesen    return false;
2154e6966266a6dbbd560e11f68e6a5ff3fd35c130dJakob Stoklund Olesen  return ++I == MRI->reg_nodbg_end();
2161e03ff42433afe3a9ffad2765b537f10db3aa921Jakob Stoklund Olesen}
2171e03ff42433afe3a9ffad2765b537f10db3aa921Jakob Stoklund Olesen
218804291e31658d46fb1db5ecaf42b31950c02a6f2Jakob Stoklund Olesen/// addKillFlag - Set kill flags on last use of a virtual register.
21901dcbf850732790fe7d5b5ed23426d535b07f316Jakob Stoklund Olesenvoid RAFast::addKillFlag(const LiveReg &LR) {
22001dcbf850732790fe7d5b5ed23426d535b07f316Jakob Stoklund Olesen  if (!LR.LastUse) return;
22101dcbf850732790fe7d5b5ed23426d535b07f316Jakob Stoklund Olesen  MachineOperand &MO = LR.LastUse->getOperand(LR.LastOpNum);
222d32e735ae6e3fbebcae9a23d7cda091770bb3a14Jakob Stoklund Olesen  if (MO.isUse() && !LR.LastUse->isRegTiedToDefOperand(LR.LastOpNum)) {
223d32e735ae6e3fbebcae9a23d7cda091770bb3a14Jakob Stoklund Olesen    if (MO.getReg() == LR.PhysReg)
2240eeb05c969c6c314ca7991a10627451762787e2dJakob Stoklund Olesen      MO.setIsKill();
2250eeb05c969c6c314ca7991a10627451762787e2dJakob Stoklund Olesen    else
2260eeb05c969c6c314ca7991a10627451762787e2dJakob Stoklund Olesen      LR.LastUse->addRegisterKilled(LR.PhysReg, TRI, true);
2270eeb05c969c6c314ca7991a10627451762787e2dJakob Stoklund Olesen  }
228804291e31658d46fb1db5ecaf42b31950c02a6f2Jakob Stoklund Olesen}
229804291e31658d46fb1db5ecaf42b31950c02a6f2Jakob Stoklund Olesen
230804291e31658d46fb1db5ecaf42b31950c02a6f2Jakob Stoklund Olesen/// killVirtReg - Mark virtreg as no longer available.
231844db9cc6f1a9458b60b8debeef3132f555dcd8fJakob Stoklund Olesenvoid RAFast::killVirtReg(LiveRegMap::iterator LRI) {
232a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  addKillFlag(*LRI);
23391ba63d230bfc3e035d2851d039e08f34f0b9bbdJakob Stoklund Olesen  assert(PhysRegState[LRI->PhysReg] == LRI->VirtReg &&
23491ba63d230bfc3e035d2851d039e08f34f0b9bbdJakob Stoklund Olesen         "Broken RegState mapping");
235a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  PhysRegState[LRI->PhysReg] = regFree;
236e6aba837974f7d2539efad9a09fe06b4d1566e5dJakob Stoklund Olesen  // Erase from LiveVirtRegs unless we're spilling in bulk.
237e6aba837974f7d2539efad9a09fe06b4d1566e5dJakob Stoklund Olesen  if (!isBulkSpilling)
238844db9cc6f1a9458b60b8debeef3132f555dcd8fJakob Stoklund Olesen    LiveVirtRegs.erase(LRI);
23976b4d5a0210f161c08543f00f355955c94d3f2ecJakob Stoklund Olesen}
24076b4d5a0210f161c08543f00f355955c94d3f2ecJakob Stoklund Olesen
24176b4d5a0210f161c08543f00f355955c94d3f2ecJakob Stoklund Olesen/// killVirtReg - Mark virtreg as no longer available.
242bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesenvoid RAFast::killVirtReg(unsigned VirtReg) {
243bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen  assert(TargetRegisterInfo::isVirtualRegister(VirtReg) &&
244bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen         "killVirtReg needs a virtual register");
245a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  LiveRegMap::iterator LRI = findLiveVirtReg(VirtReg);
246844db9cc6f1a9458b60b8debeef3132f555dcd8fJakob Stoklund Olesen  if (LRI != LiveVirtRegs.end())
247844db9cc6f1a9458b60b8debeef3132f555dcd8fJakob Stoklund Olesen    killVirtReg(LRI);
24800207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen}
24900207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
250bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen/// spillVirtReg - This method spills the value specified by VirtReg into the
25124a1182184336c088f70e86191ebda47df629bebEli Friedman/// corresponding stack slot if needed.
252e6aba837974f7d2539efad9a09fe06b4d1566e5dJakob Stoklund Olesenvoid RAFast::spillVirtReg(MachineBasicBlock::iterator MI, unsigned VirtReg) {
253bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen  assert(TargetRegisterInfo::isVirtualRegister(VirtReg) &&
254bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen         "Spilling a physical register is illegal!");
255a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  LiveRegMap::iterator LRI = findLiveVirtReg(VirtReg);
256844db9cc6f1a9458b60b8debeef3132f555dcd8fJakob Stoklund Olesen  assert(LRI != LiveVirtRegs.end() && "Spilling unmapped virtual register");
257844db9cc6f1a9458b60b8debeef3132f555dcd8fJakob Stoklund Olesen  spillVirtReg(MI, LRI);
2587d4f25904de543b039a28eddbea3034a5d80e7f8Jakob Stoklund Olesen}
2597d4f25904de543b039a28eddbea3034a5d80e7f8Jakob Stoklund Olesen
2607d4f25904de543b039a28eddbea3034a5d80e7f8Jakob Stoklund Olesen/// spillVirtReg - Do the actual work of spilling.
2616fb69d85e9576445e98c4114ee7064deb4476712Jakob Stoklund Olesenvoid RAFast::spillVirtReg(MachineBasicBlock::iterator MI,
262844db9cc6f1a9458b60b8debeef3132f555dcd8fJakob Stoklund Olesen                          LiveRegMap::iterator LRI) {
263a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  LiveReg &LR = *LRI;
264a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  assert(PhysRegState[LR.PhysReg] == LRI->VirtReg && "Broken RegState mapping");
26576b4d5a0210f161c08543f00f355955c94d3f2ecJakob Stoklund Olesen
266210e2afcc74e8ce5102d13939b23040fafa71c09Jakob Stoklund Olesen  if (LR.Dirty) {
267e6aba837974f7d2539efad9a09fe06b4d1566e5dJakob Stoklund Olesen    // If this physreg is used by the instruction, we want to kill it on the
268e6aba837974f7d2539efad9a09fe06b4d1566e5dJakob Stoklund Olesen    // instruction, not on the spill.
269844db9cc6f1a9458b60b8debeef3132f555dcd8fJakob Stoklund Olesen    bool SpillKill = LR.LastUse != MI;
270210e2afcc74e8ce5102d13939b23040fafa71c09Jakob Stoklund Olesen    LR.Dirty = false;
271a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    DEBUG(dbgs() << "Spilling " << PrintReg(LRI->VirtReg, TRI)
2724314268128be6d54c9a7f0709680e5a5b40f3ab3Jakob Stoklund Olesen                 << " in " << PrintReg(LR.PhysReg, TRI));
273a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    const TargetRegisterClass *RC = MRI->getRegClass(LRI->VirtReg);
274a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    int FI = getStackSpaceFor(LRI->VirtReg, RC);
2756fb69d85e9576445e98c4114ee7064deb4476712Jakob Stoklund Olesen    DEBUG(dbgs() << " to stack slot #" << FI << "\n");
276844db9cc6f1a9458b60b8debeef3132f555dcd8fJakob Stoklund Olesen    TII->storeRegToStackSlot(*MBB, MI, LR.PhysReg, SpillKill, FI, RC, TRI);
27700207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen    ++NumStores;   // Update statistics
27800207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
27907cb689d6260b78861d829bb05b188e1558c528eJim Grosbach    // If this register is used by DBG_VALUE then insert new DBG_VALUE to
280459a36bd34809ffc5d74de79b3e46f6e02e5184fDevang Patel    // identify spilled location as the place to find corresponding variable's
281459a36bd34809ffc5d74de79b3e46f6e02e5184fDevang Patel    // value.
282a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    SmallVector<MachineInstr *, 4> &LRIDbgValues =
283a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen      LiveDbgValueMap[LRI->VirtReg];
28472d9b0e4fce90a635af5c80cb6992ac639279d59Devang Patel    for (unsigned li = 0, le = LRIDbgValues.size(); li != le; ++li) {
28572d9b0e4fce90a635af5c80cb6992ac639279d59Devang Patel      MachineInstr *DBG = LRIDbgValues[li];
28607cb689d6260b78861d829bb05b188e1558c528eJim Grosbach      const MDNode *MDPtr =
287459a36bd34809ffc5d74de79b3e46f6e02e5184fDevang Patel        DBG->getOperand(DBG->getNumOperands()-1).getMetadata();
288459a36bd34809ffc5d74de79b3e46f6e02e5184fDevang Patel      int64_t Offset = 0;
289459a36bd34809ffc5d74de79b3e46f6e02e5184fDevang Patel      if (DBG->getOperand(1).isImm())
290459a36bd34809ffc5d74de79b3e46f6e02e5184fDevang Patel        Offset = DBG->getOperand(1).getImm();
29131defcf2349916ac759be33baaa4060703fd78dfDevang Patel      DebugLoc DL;
29231defcf2349916ac759be33baaa4060703fd78dfDevang Patel      if (MI == MBB->end()) {
29331defcf2349916ac759be33baaa4060703fd78dfDevang Patel        // If MI is at basic block end then use last instruction's location.
29431defcf2349916ac759be33baaa4060703fd78dfDevang Patel        MachineBasicBlock::iterator EI = MI;
29531defcf2349916ac759be33baaa4060703fd78dfDevang Patel        DL = (--EI)->getDebugLoc();
29631defcf2349916ac759be33baaa4060703fd78dfDevang Patel      }
29731defcf2349916ac759be33baaa4060703fd78dfDevang Patel      else
29831defcf2349916ac759be33baaa4060703fd78dfDevang Patel        DL = MI->getDebugLoc();
29907cb689d6260b78861d829bb05b188e1558c528eJim Grosbach      if (MachineInstr *NewDV =
300459a36bd34809ffc5d74de79b3e46f6e02e5184fDevang Patel          TII->emitFrameIndexDebugValue(*MF, FI, Offset, MDPtr, DL)) {
301459a36bd34809ffc5d74de79b3e46f6e02e5184fDevang Patel        MachineBasicBlock *MBB = DBG->getParent();
302459a36bd34809ffc5d74de79b3e46f6e02e5184fDevang Patel        MBB->insert(MI, NewDV);
303459a36bd34809ffc5d74de79b3e46f6e02e5184fDevang Patel        DEBUG(dbgs() << "Inserting debug info due to spill:" << "\n" << *NewDV);
304459a36bd34809ffc5d74de79b3e46f6e02e5184fDevang Patel      }
305459a36bd34809ffc5d74de79b3e46f6e02e5184fDevang Patel    }
30691ba63d230bfc3e035d2851d039e08f34f0b9bbdJakob Stoklund Olesen    // Now this register is spilled there is should not be any DBG_VALUE
30791ba63d230bfc3e035d2851d039e08f34f0b9bbdJakob Stoklund Olesen    // pointing to this register because they are all pointing to spilled value
30891ba63d230bfc3e035d2851d039e08f34f0b9bbdJakob Stoklund Olesen    // now.
3096f373a87cba3b0c88bc76bf1d03ee5f81143764fDevang Patel    LRIDbgValues.clear();
310844db9cc6f1a9458b60b8debeef3132f555dcd8fJakob Stoklund Olesen    if (SpillKill)
311210e2afcc74e8ce5102d13939b23040fafa71c09Jakob Stoklund Olesen      LR.LastUse = 0; // Don't kill register again
312bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen  }
313844db9cc6f1a9458b60b8debeef3132f555dcd8fJakob Stoklund Olesen  killVirtReg(LRI);
31400207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen}
31500207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
316bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen/// spillAll - Spill all dirty virtregs without killing them.
317bab24216cc77477d475e9d2ae18e275c5b2054a3Akira Hatanakavoid RAFast::spillAll(MachineBasicBlock::iterator MI) {
318f3ea06b108d45c53dade87d6f1f48ac0a0e20562Jakob Stoklund Olesen  if (LiveVirtRegs.empty()) return;
319e6aba837974f7d2539efad9a09fe06b4d1566e5dJakob Stoklund Olesen  isBulkSpilling = true;
3202997985b4cafc2a1e562819a2f3e0c6abe5fb223Jakob Stoklund Olesen  // The LiveRegMap is keyed by an unsigned (the virtreg number), so the order
3212997985b4cafc2a1e562819a2f3e0c6abe5fb223Jakob Stoklund Olesen  // of spilling here is deterministic, if arbitrary.
3222997985b4cafc2a1e562819a2f3e0c6abe5fb223Jakob Stoklund Olesen  for (LiveRegMap::iterator i = LiveVirtRegs.begin(), e = LiveVirtRegs.end();
3232997985b4cafc2a1e562819a2f3e0c6abe5fb223Jakob Stoklund Olesen       i != e; ++i)
324e6aba837974f7d2539efad9a09fe06b4d1566e5dJakob Stoklund Olesen    spillVirtReg(MI, i);
325e6aba837974f7d2539efad9a09fe06b4d1566e5dJakob Stoklund Olesen  LiveVirtRegs.clear();
326e6aba837974f7d2539efad9a09fe06b4d1566e5dJakob Stoklund Olesen  isBulkSpilling = false;
327bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen}
32800207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
3294ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen/// usePhysReg - Handle the direct use of a physical register.
3304ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen/// Check that the register is not used by a virtreg.
3314ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen/// Kill the physreg, marking it free.
3324ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen/// This may add implicit kills to MO->getParent() and invalidate MO.
3334ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesenvoid RAFast::usePhysReg(MachineOperand &MO) {
3344ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen  unsigned PhysReg = MO.getReg();
3354ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen  assert(TargetRegisterInfo::isPhysicalRegister(PhysReg) &&
3364ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen         "Bad usePhysReg operand");
3374ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen
3384ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen  switch (PhysRegState[PhysReg]) {
339bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen  case regDisabled:
340bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    break;
341bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen  case regReserved:
342bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    PhysRegState[PhysReg] = regFree;
3434ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen    // Fall through
3444ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen  case regFree:
345d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen    UsedInInstr.insert(PhysReg);
3464ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen    MO.setIsKill();
347bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    return;
348bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen  default:
349f299da8ec3fee88a1b275560a7f94be4cf10d089Eric Christopher    // The physreg was allocated to a virtual register. That means the value we
3504ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen    // wanted has been clobbered.
3514ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen    llvm_unreachable("Instruction uses an allocated register");
35200207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  }
35300207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
3544ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen  // Maybe a superregister is reserved?
355396618b43a85e12d290a90b181c6af5d7c0c5f11Jakob Stoklund Olesen  for (MCRegAliasIterator AI(PhysReg, TRI, false); AI.isValid(); ++AI) {
356396618b43a85e12d290a90b181c6af5d7c0c5f11Jakob Stoklund Olesen    unsigned Alias = *AI;
3574ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen    switch (PhysRegState[Alias]) {
358bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    case regDisabled:
359bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      break;
360bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    case regReserved:
3614ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen      assert(TRI->isSuperRegister(PhysReg, Alias) &&
3624ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen             "Instruction is not using a subregister of a reserved register");
3634ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen      // Leave the superregister in the working set.
364bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      PhysRegState[Alias] = regFree;
365d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen      UsedInInstr.insert(Alias);
3664ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen      MO.getParent()->addRegisterKilled(Alias, TRI, true);
3674ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen      return;
3684ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen    case regFree:
3694ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen      if (TRI->isSuperRegister(PhysReg, Alias)) {
3704ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen        // Leave the superregister in the working set.
371d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen        UsedInInstr.insert(Alias);
3724ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen        MO.getParent()->addRegisterKilled(Alias, TRI, true);
3734ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen        return;
3744ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen      }
3754ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen      // Some other alias was in the working set - clear it.
3764ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen      PhysRegState[Alias] = regDisabled;
377bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      break;
378bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    default:
3794ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen      llvm_unreachable("Instruction uses an alias of an allocated register");
380bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    }
38100207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  }
3824ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen
3834ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen  // All aliases are disabled, bring register into working set.
3844ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen  PhysRegState[PhysReg] = regFree;
385d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen  UsedInInstr.insert(PhysReg);
3864ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen  MO.setIsKill();
38700207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen}
38800207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
3894ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen/// definePhysReg - Mark PhysReg as reserved or free after spilling any
3904ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen/// virtregs. This is very similar to defineVirtReg except the physreg is
3914ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen/// reserved instead of allocated.
3926fb69d85e9576445e98c4114ee7064deb4476712Jakob Stoklund Olesenvoid RAFast::definePhysReg(MachineInstr *MI, unsigned PhysReg,
3936fb69d85e9576445e98c4114ee7064deb4476712Jakob Stoklund Olesen                           RegState NewState) {
394d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen  UsedInInstr.insert(PhysReg);
395bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen  switch (unsigned VirtReg = PhysRegState[PhysReg]) {
396bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen  case regDisabled:
397bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    break;
3984ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen  default:
399e6aba837974f7d2539efad9a09fe06b4d1566e5dJakob Stoklund Olesen    spillVirtReg(MI, VirtReg);
4004ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen    // Fall through.
401bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen  case regFree:
402bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen  case regReserved:
4034ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen    PhysRegState[PhysReg] = NewState;
404bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    return;
405bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen  }
406bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen
4074ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen  // This is a disabled register, disable all aliases.
4084ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen  PhysRegState[PhysReg] = NewState;
409396618b43a85e12d290a90b181c6af5d7c0c5f11Jakob Stoklund Olesen  for (MCRegAliasIterator AI(PhysReg, TRI, false); AI.isValid(); ++AI) {
410396618b43a85e12d290a90b181c6af5d7c0c5f11Jakob Stoklund Olesen    unsigned Alias = *AI;
411bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    switch (unsigned VirtReg = PhysRegState[Alias]) {
412bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    case regDisabled:
413bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      break;
414bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    default:
415e6aba837974f7d2539efad9a09fe06b4d1566e5dJakob Stoklund Olesen      spillVirtReg(MI, VirtReg);
4164ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen      // Fall through.
4174ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen    case regFree:
4184ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen    case regReserved:
4194ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen      PhysRegState[Alias] = regDisabled;
4204ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen      if (TRI->isSuperRegister(PhysReg, Alias))
4214ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen        return;
422bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      break;
423bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    }
424bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen  }
425bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen}
42600207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
4274ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen
428548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen// calcSpillCost - Return the cost of spilling clearing out PhysReg and
429548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen// aliases so it is free for allocation.
430548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen// Returns 0 when PhysReg is free or disabled with all aliases disabled - it
431548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen// can be allocated directly.
432548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen// Returns spillImpossible when PhysReg or an alias can't be spilled.
433548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesenunsigned RAFast::calcSpillCost(unsigned PhysReg) const {
434d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen  if (UsedInInstr.count(PhysReg)) {
43527ce3b96e51887995f94d8c78a6c7e79bf7cdcddJakob Stoklund Olesen    DEBUG(dbgs() << PrintReg(PhysReg, TRI) << " is already used in instr.\n");
436b8acb7be804c8c537f2475f3a24303a0b37ab107Jakob Stoklund Olesen    return spillImpossible;
4370b756349a718e046abba84c316877a682eb0ff2fEric Christopher  }
438548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen  switch (unsigned VirtReg = PhysRegState[PhysReg]) {
439548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen  case regDisabled:
440548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen    break;
441548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen  case regFree:
442548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen    return 0;
443548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen  case regReserved:
44427ce3b96e51887995f94d8c78a6c7e79bf7cdcddJakob Stoklund Olesen    DEBUG(dbgs() << PrintReg(VirtReg, TRI) << " corresponding "
44527ce3b96e51887995f94d8c78a6c7e79bf7cdcddJakob Stoklund Olesen                 << PrintReg(PhysReg, TRI) << " is reserved already.\n");
446548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen    return spillImpossible;
447a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  default: {
448a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    LiveRegMap::const_iterator I = findLiveVirtReg(VirtReg);
449a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    assert(I != LiveVirtRegs.end() && "Missing VirtReg entry");
450a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    return I->Dirty ? spillDirty : spillClean;
451a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  }
452548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen  }
453548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen
454bbfc3b30986ff89487350cade99ea7c90e2c8165Eric Christopher  // This is a disabled register, add up cost of aliases.
45527ce3b96e51887995f94d8c78a6c7e79bf7cdcddJakob Stoklund Olesen  DEBUG(dbgs() << PrintReg(PhysReg, TRI) << " is disabled.\n");
456548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen  unsigned Cost = 0;
457396618b43a85e12d290a90b181c6af5d7c0c5f11Jakob Stoklund Olesen  for (MCRegAliasIterator AI(PhysReg, TRI, false); AI.isValid(); ++AI) {
458396618b43a85e12d290a90b181c6af5d7c0c5f11Jakob Stoklund Olesen    unsigned Alias = *AI;
459d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen    if (UsedInInstr.count(Alias))
460d31df87f41891c9ea459282c666c6e1cab9bd4c7Eric Christopher      return spillImpossible;
461548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen    switch (unsigned VirtReg = PhysRegState[Alias]) {
462548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen    case regDisabled:
463548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen      break;
464548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen    case regFree:
465548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen      ++Cost;
466548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen      break;
467548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen    case regReserved:
468548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen      return spillImpossible;
469a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    default: {
470a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen      LiveRegMap::const_iterator I = findLiveVirtReg(VirtReg);
471a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen      assert(I != LiveVirtRegs.end() && "Missing VirtReg entry");
472a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen      Cost += I->Dirty ? spillDirty : spillClean;
473548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen      break;
474548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen    }
475a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    }
476548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen  }
477548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen  return Cost;
478548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen}
479548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen
480548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen
48100207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen/// assignVirtToPhysReg - This method updates local state so that we know
48200207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen/// that PhysReg is the proper container for VirtReg now.  The physical
48300207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen/// register must not be used for anything else when this is called.
48400207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen///
485a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesenvoid RAFast::assignVirtToPhysReg(LiveReg &LR, unsigned PhysReg) {
486a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  DEBUG(dbgs() << "Assigning " << PrintReg(LR.VirtReg, TRI) << " to "
4874314268128be6d54c9a7f0709680e5a5b40f3ab3Jakob Stoklund Olesen               << PrintReg(PhysReg, TRI) << "\n");
488a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  PhysRegState[PhysReg] = LR.VirtReg;
489a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  assert(!LR.PhysReg && "Already assigned a physreg");
490a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  LR.PhysReg = PhysReg;
491a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen}
492a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen
493a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund OlesenRAFast::LiveRegMap::iterator
494a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund OlesenRAFast::assignVirtToPhysReg(unsigned VirtReg, unsigned PhysReg) {
495a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  LiveRegMap::iterator LRI = findLiveVirtReg(VirtReg);
496a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  assert(LRI != LiveVirtRegs.end() && "VirtReg disappeared");
497a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  assignVirtToPhysReg(*LRI, PhysReg);
498a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  return LRI;
49900207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen}
50000207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
501bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen/// allocVirtReg - Allocate a physical register for VirtReg.
502a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund OlesenRAFast::LiveRegMap::iterator RAFast::allocVirtReg(MachineInstr *MI,
503a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen                                                  LiveRegMap::iterator LRI,
504a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen                                                  unsigned Hint) {
505a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  const unsigned VirtReg = LRI->VirtReg;
50601dcbf850732790fe7d5b5ed23426d535b07f316Jakob Stoklund Olesen
507bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen  assert(TargetRegisterInfo::isVirtualRegister(VirtReg) &&
508bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen         "Can only allocate virtual registers");
50900207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
5104bf4bafcced902ee6d58a90486768f08a3795d02Jakob Stoklund Olesen  const TargetRegisterClass *RC = MRI->getRegClass(VirtReg);
511bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen
5124bf4bafcced902ee6d58a90486768f08a3795d02Jakob Stoklund Olesen  // Ignore invalid hints.
5134bf4bafcced902ee6d58a90486768f08a3795d02Jakob Stoklund Olesen  if (Hint && (!TargetRegisterInfo::isPhysicalRegister(Hint) ||
51414d1dd95c7c969e07defebb6fe65df2fae1b30cfJakob Stoklund Olesen               !RC->contains(Hint) || !MRI->isAllocatable(Hint)))
5154bf4bafcced902ee6d58a90486768f08a3795d02Jakob Stoklund Olesen    Hint = 0;
5164bf4bafcced902ee6d58a90486768f08a3795d02Jakob Stoklund Olesen
5174bf4bafcced902ee6d58a90486768f08a3795d02Jakob Stoklund Olesen  // Take hint when possible.
5184bf4bafcced902ee6d58a90486768f08a3795d02Jakob Stoklund Olesen  if (Hint) {
5195e5ed4457749995b46d46e9769e657fcc0818e2cJakob Stoklund Olesen    // Ignore the hint if we would have to spill a dirty register.
5205e5ed4457749995b46d46e9769e657fcc0818e2cJakob Stoklund Olesen    unsigned Cost = calcSpillCost(Hint);
5215e5ed4457749995b46d46e9769e657fcc0818e2cJakob Stoklund Olesen    if (Cost < spillDirty) {
5225e5ed4457749995b46d46e9769e657fcc0818e2cJakob Stoklund Olesen      if (Cost)
5235e5ed4457749995b46d46e9769e657fcc0818e2cJakob Stoklund Olesen        definePhysReg(MI, Hint, regFree);
524a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen      // definePhysReg may kill virtual registers and modify LiveVirtRegs.
525a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen      // That invalidates LRI, so run a new lookup for VirtReg.
526a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen      return assignVirtToPhysReg(VirtReg, Hint);
5274bf4bafcced902ee6d58a90486768f08a3795d02Jakob Stoklund Olesen    }
5284bf4bafcced902ee6d58a90486768f08a3795d02Jakob Stoklund Olesen  }
5294bf4bafcced902ee6d58a90486768f08a3795d02Jakob Stoklund Olesen
5305d20c3152bd7fe91eda1b58a5eb6da7067874c61Jakob Stoklund Olesen  ArrayRef<unsigned> AO = RegClassInfo.getOrder(RC);
531548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen
532bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen  // First try to find a completely free register.
5335d20c3152bd7fe91eda1b58a5eb6da7067874c61Jakob Stoklund Olesen  for (ArrayRef<unsigned>::iterator I = AO.begin(), E = AO.end(); I != E; ++I) {
534bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    unsigned PhysReg = *I;
535d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen    if (PhysRegState[PhysReg] == regFree && !UsedInInstr.count(PhysReg)) {
536a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen      assignVirtToPhysReg(*LRI, PhysReg);
537a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen      return LRI;
538a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    }
539bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen  }
54000207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
5414314268128be6d54c9a7f0709680e5a5b40f3ab3Jakob Stoklund Olesen  DEBUG(dbgs() << "Allocating " << PrintReg(VirtReg) << " from "
5424314268128be6d54c9a7f0709680e5a5b40f3ab3Jakob Stoklund Olesen               << RC->getName() << "\n");
543548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen
544548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen  unsigned BestReg = 0, BestCost = spillImpossible;
5455d20c3152bd7fe91eda1b58a5eb6da7067874c61Jakob Stoklund Olesen  for (ArrayRef<unsigned>::iterator I = AO.begin(), E = AO.end(); I != E; ++I) {
546548643c573d53950e28e9e810cd0454ba9a21af0Jakob Stoklund Olesen    unsigned Cost = calcSpillCost(*I);
54727ce3b96e51887995f94d8c78a6c7e79bf7cdcddJakob Stoklund Olesen    DEBUG(dbgs() << "\tRegister: " << PrintReg(*I, TRI) << "\n");
5480b756349a718e046abba84c316877a682eb0ff2fEric Christopher    DEBUG(dbgs() << "\tCost: " << Cost << "\n");
5490b756349a718e046abba84c316877a682eb0ff2fEric Christopher    DEBUG(dbgs() << "\tBestCost: " << BestCost << "\n");
550f3ea06b108d45c53dade87d6f1f48ac0a0e20562Jakob Stoklund Olesen    // Cost is 0 when all aliases are already disabled.
551a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    if (Cost == 0) {
552a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen      assignVirtToPhysReg(*LRI, *I);
553a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen      return LRI;
554a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    }
555f3ea06b108d45c53dade87d6f1f48ac0a0e20562Jakob Stoklund Olesen    if (Cost < BestCost)
556f3ea06b108d45c53dade87d6f1f48ac0a0e20562Jakob Stoklund Olesen      BestReg = *I, BestCost = Cost;
55700207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  }
55800207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
559bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen  if (BestReg) {
560f3ea06b108d45c53dade87d6f1f48ac0a0e20562Jakob Stoklund Olesen    definePhysReg(MI, BestReg, regFree);
561a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    // definePhysReg may kill virtual registers and modify LiveVirtRegs.
562a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    // That invalidates LRI, so run a new lookup for VirtReg.
563a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    return assignVirtToPhysReg(VirtReg, BestReg);
564bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen  }
56500207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
5669d812a2805161665d56a78734da98b58f39ce0fcJakob Stoklund Olesen  // Nothing we can do. Report an error and keep going with a bad allocation.
5679d812a2805161665d56a78734da98b58f39ce0fcJakob Stoklund Olesen  MI->emitError("ran out of registers during register allocation");
5689d812a2805161665d56a78734da98b58f39ce0fcJakob Stoklund Olesen  definePhysReg(MI, *AO.begin(), regFree);
569a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  return assignVirtToPhysReg(VirtReg, *AO.begin());
57000207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen}
57100207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
572bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen/// defineVirtReg - Allocate a register for VirtReg and mark it as dirty.
573646dd7c899ea213301e193a25536a4bceebf7937Jakob Stoklund OlesenRAFast::LiveRegMap::iterator
574646dd7c899ea213301e193a25536a4bceebf7937Jakob Stoklund OlesenRAFast::defineVirtReg(MachineInstr *MI, unsigned OpNum,
575646dd7c899ea213301e193a25536a4bceebf7937Jakob Stoklund Olesen                      unsigned VirtReg, unsigned Hint) {
576bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen  assert(TargetRegisterInfo::isVirtualRegister(VirtReg) &&
577bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen         "Not a virtual register");
578844db9cc6f1a9458b60b8debeef3132f555dcd8fJakob Stoklund Olesen  LiveRegMap::iterator LRI;
57901dcbf850732790fe7d5b5ed23426d535b07f316Jakob Stoklund Olesen  bool New;
580a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  tie(LRI, New) = LiveVirtRegs.insert(LiveReg(VirtReg));
5810c9e4f5f3ff139733d74462a0ad5b94014e764a8Jakob Stoklund Olesen  if (New) {
5820c9e4f5f3ff139733d74462a0ad5b94014e764a8Jakob Stoklund Olesen    // If there is no hint, peek at the only use of this register.
5830c9e4f5f3ff139733d74462a0ad5b94014e764a8Jakob Stoklund Olesen    if ((!Hint || !TargetRegisterInfo::isPhysicalRegister(Hint)) &&
5840c9e4f5f3ff139733d74462a0ad5b94014e764a8Jakob Stoklund Olesen        MRI->hasOneNonDBGUse(VirtReg)) {
585273f7e42994a5bce0614d04d96dbfdf05fd652e5Jakob Stoklund Olesen      const MachineInstr &UseMI = *MRI->use_nodbg_begin(VirtReg);
5860c9e4f5f3ff139733d74462a0ad5b94014e764a8Jakob Stoklund Olesen      // It's a copy, use the destination register as a hint.
587273f7e42994a5bce0614d04d96dbfdf05fd652e5Jakob Stoklund Olesen      if (UseMI.isCopyLike())
588273f7e42994a5bce0614d04d96dbfdf05fd652e5Jakob Stoklund Olesen        Hint = UseMI.getOperand(0).getReg();
5890c9e4f5f3ff139733d74462a0ad5b94014e764a8Jakob Stoklund Olesen    }
590a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    LRI = allocVirtReg(MI, LRI, Hint);
591a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  } else if (LRI->LastUse) {
5920eeb05c969c6c314ca7991a10627451762787e2dJakob Stoklund Olesen    // Redefining a live register - kill at the last use, unless it is this
5930eeb05c969c6c314ca7991a10627451762787e2dJakob Stoklund Olesen    // instruction defining VirtReg multiple times.
594a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    if (LRI->LastUse != MI || LRI->LastUse->getOperand(LRI->LastOpNum).isUse())
595a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen      addKillFlag(*LRI);
5960eeb05c969c6c314ca7991a10627451762787e2dJakob Stoklund Olesen  }
597a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  assert(LRI->PhysReg && "Register not assigned");
598a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  LRI->LastUse = MI;
599a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  LRI->LastOpNum = OpNum;
600a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  LRI->Dirty = true;
601d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen  UsedInInstr.insert(LRI->PhysReg);
602646dd7c899ea213301e193a25536a4bceebf7937Jakob Stoklund Olesen  return LRI;
603bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen}
60400207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
605bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen/// reloadVirtReg - Make sure VirtReg is available in a physreg and return it.
606646dd7c899ea213301e193a25536a4bceebf7937Jakob Stoklund OlesenRAFast::LiveRegMap::iterator
607646dd7c899ea213301e193a25536a4bceebf7937Jakob Stoklund OlesenRAFast::reloadVirtReg(MachineInstr *MI, unsigned OpNum,
608646dd7c899ea213301e193a25536a4bceebf7937Jakob Stoklund Olesen                      unsigned VirtReg, unsigned Hint) {
609bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen  assert(TargetRegisterInfo::isVirtualRegister(VirtReg) &&
610bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen         "Not a virtual register");
611844db9cc6f1a9458b60b8debeef3132f555dcd8fJakob Stoklund Olesen  LiveRegMap::iterator LRI;
61201dcbf850732790fe7d5b5ed23426d535b07f316Jakob Stoklund Olesen  bool New;
613a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  tie(LRI, New) = LiveVirtRegs.insert(LiveReg(VirtReg));
614ac3e529831877cea609ed668f95b1dc06e34698cJakob Stoklund Olesen  MachineOperand &MO = MI->getOperand(OpNum);
61501dcbf850732790fe7d5b5ed23426d535b07f316Jakob Stoklund Olesen  if (New) {
616a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    LRI = allocVirtReg(MI, LRI, Hint);
6174bf4bafcced902ee6d58a90486768f08a3795d02Jakob Stoklund Olesen    const TargetRegisterClass *RC = MRI->getRegClass(VirtReg);
618bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    int FrameIndex = getStackSpaceFor(VirtReg, RC);
6194314268128be6d54c9a7f0709680e5a5b40f3ab3Jakob Stoklund Olesen    DEBUG(dbgs() << "Reloading " << PrintReg(VirtReg, TRI) << " into "
620a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen                 << PrintReg(LRI->PhysReg, TRI) << "\n");
621a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    TII->loadRegFromStackSlot(*MBB, MI, LRI->PhysReg, FrameIndex, RC, TRI);
622bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    ++NumLoads;
623a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  } else if (LRI->Dirty) {
6241e03ff42433afe3a9ffad2765b537f10db3aa921Jakob Stoklund Olesen    if (isLastUseOfLocalReg(MO)) {
6251e03ff42433afe3a9ffad2765b537f10db3aa921Jakob Stoklund Olesen      DEBUG(dbgs() << "Killing last use: " << MO << "\n");
626d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen      if (MO.isUse())
627d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen        MO.setIsKill();
628d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen      else
629d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen        MO.setIsDead();
6301e03ff42433afe3a9ffad2765b537f10db3aa921Jakob Stoklund Olesen    } else if (MO.isKill()) {
6311e03ff42433afe3a9ffad2765b537f10db3aa921Jakob Stoklund Olesen      DEBUG(dbgs() << "Clearing dubious kill: " << MO << "\n");
6321e03ff42433afe3a9ffad2765b537f10db3aa921Jakob Stoklund Olesen      MO.setIsKill(false);
633d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen    } else if (MO.isDead()) {
634d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen      DEBUG(dbgs() << "Clearing dubious dead: " << MO << "\n");
635d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen      MO.setIsDead(false);
6361e03ff42433afe3a9ffad2765b537f10db3aa921Jakob Stoklund Olesen    }
637ac3e529831877cea609ed668f95b1dc06e34698cJakob Stoklund Olesen  } else if (MO.isKill()) {
638ac3e529831877cea609ed668f95b1dc06e34698cJakob Stoklund Olesen    // We must remove kill flags from uses of reloaded registers because the
639ac3e529831877cea609ed668f95b1dc06e34698cJakob Stoklund Olesen    // register would be killed immediately, and there might be a second use:
640ac3e529831877cea609ed668f95b1dc06e34698cJakob Stoklund Olesen    //   %foo = OR %x<kill>, %x
641ac3e529831877cea609ed668f95b1dc06e34698cJakob Stoklund Olesen    // This would cause a second reload of %x into a different register.
642ac3e529831877cea609ed668f95b1dc06e34698cJakob Stoklund Olesen    DEBUG(dbgs() << "Clearing clean kill: " << MO << "\n");
643ac3e529831877cea609ed668f95b1dc06e34698cJakob Stoklund Olesen    MO.setIsKill(false);
644d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen  } else if (MO.isDead()) {
645d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen    DEBUG(dbgs() << "Clearing clean dead: " << MO << "\n");
646d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen    MO.setIsDead(false);
64700207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  }
648a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  assert(LRI->PhysReg && "Register not assigned");
649a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  LRI->LastUse = MI;
650a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  LRI->LastOpNum = OpNum;
651d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen  UsedInInstr.insert(LRI->PhysReg);
652646dd7c899ea213301e193a25536a4bceebf7937Jakob Stoklund Olesen  return LRI;
653bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen}
65400207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
6550eeb05c969c6c314ca7991a10627451762787e2dJakob Stoklund Olesen// setPhysReg - Change operand OpNum in MI the refer the PhysReg, considering
6560eeb05c969c6c314ca7991a10627451762787e2dJakob Stoklund Olesen// subregs. This may invalidate any operand pointers.
6570eeb05c969c6c314ca7991a10627451762787e2dJakob Stoklund Olesen// Return true if the operand kills its register.
6580eeb05c969c6c314ca7991a10627451762787e2dJakob Stoklund Olesenbool RAFast::setPhysReg(MachineInstr *MI, unsigned OpNum, unsigned PhysReg) {
6590eeb05c969c6c314ca7991a10627451762787e2dJakob Stoklund Olesen  MachineOperand &MO = MI->getOperand(OpNum);
6606565a709702995fa8a5e659269d6cda134383be7Jakob Stoklund Olesen  bool Dead = MO.isDead();
66141e1401de5cb8752fb9d06e65e62bfe97cc1304eJakob Stoklund Olesen  if (!MO.getSubReg()) {
662bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    MO.setReg(PhysReg);
6636565a709702995fa8a5e659269d6cda134383be7Jakob Stoklund Olesen    return MO.isKill() || Dead;
66441e1401de5cb8752fb9d06e65e62bfe97cc1304eJakob Stoklund Olesen  }
66541e1401de5cb8752fb9d06e65e62bfe97cc1304eJakob Stoklund Olesen
66641e1401de5cb8752fb9d06e65e62bfe97cc1304eJakob Stoklund Olesen  // Handle subregister index.
66741e1401de5cb8752fb9d06e65e62bfe97cc1304eJakob Stoklund Olesen  MO.setReg(PhysReg ? TRI->getSubReg(PhysReg, MO.getSubReg()) : 0);
66841e1401de5cb8752fb9d06e65e62bfe97cc1304eJakob Stoklund Olesen  MO.setSubReg(0);
669d32e735ae6e3fbebcae9a23d7cda091770bb3a14Jakob Stoklund Olesen
670d32e735ae6e3fbebcae9a23d7cda091770bb3a14Jakob Stoklund Olesen  // A kill flag implies killing the full register. Add corresponding super
671d32e735ae6e3fbebcae9a23d7cda091770bb3a14Jakob Stoklund Olesen  // register kill.
672d32e735ae6e3fbebcae9a23d7cda091770bb3a14Jakob Stoklund Olesen  if (MO.isKill()) {
673d32e735ae6e3fbebcae9a23d7cda091770bb3a14Jakob Stoklund Olesen    MI->addRegisterKilled(PhysReg, TRI, true);
67441e1401de5cb8752fb9d06e65e62bfe97cc1304eJakob Stoklund Olesen    return true;
67541e1401de5cb8752fb9d06e65e62bfe97cc1304eJakob Stoklund Olesen  }
6764d10829e1296b7aea0455e000fc318b147182c1cJakob Stoklund Olesen
6774d10829e1296b7aea0455e000fc318b147182c1cJakob Stoklund Olesen  // A <def,read-undef> of a sub-register requires an implicit def of the full
6784d10829e1296b7aea0455e000fc318b147182c1cJakob Stoklund Olesen  // register.
6794d10829e1296b7aea0455e000fc318b147182c1cJakob Stoklund Olesen  if (MO.isDef() && MO.isUndef())
6804d10829e1296b7aea0455e000fc318b147182c1cJakob Stoklund Olesen    MI->addRegisterDefined(PhysReg, TRI);
6814d10829e1296b7aea0455e000fc318b147182c1cJakob Stoklund Olesen
6826565a709702995fa8a5e659269d6cda134383be7Jakob Stoklund Olesen  return Dead;
68300207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen}
68400207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
685d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen// Handle special instruction operand like early clobbers and tied ops when
686d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen// there are additional physreg defines.
687d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesenvoid RAFast::handleThroughOperands(MachineInstr *MI,
688d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen                                   SmallVectorImpl<unsigned> &VirtDead) {
689d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen  DEBUG(dbgs() << "Scanning for through registers:");
690d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen  SmallSet<unsigned, 8> ThroughRegs;
691d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
692d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    MachineOperand &MO = MI->getOperand(i);
693d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    if (!MO.isReg()) continue;
694d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    unsigned Reg = MO.getReg();
695c9df025e33ac435adb3b3318d237c36ca7cec659Jakob Stoklund Olesen    if (!TargetRegisterInfo::isVirtualRegister(Reg))
696c9df025e33ac435adb3b3318d237c36ca7cec659Jakob Stoklund Olesen      continue;
697d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen    if (MO.isEarlyClobber() || MI->isRegTiedToDefOperand(i) ||
698d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen        (MO.getSubReg() && MI->readsVirtualRegister(Reg))) {
699d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen      if (ThroughRegs.insert(Reg))
7004314268128be6d54c9a7f0709680e5a5b40f3ab3Jakob Stoklund Olesen        DEBUG(dbgs() << ' ' << PrintReg(Reg));
701d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    }
702d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen  }
703d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen
704d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen  // If any physreg defines collide with preallocated through registers,
705d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen  // we must spill and reallocate.
706d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen  DEBUG(dbgs() << "\nChecking for physdef collisions.\n");
707d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
708d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    MachineOperand &MO = MI->getOperand(i);
709d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    if (!MO.isReg() || !MO.isDef()) continue;
710d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    unsigned Reg = MO.getReg();
711d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    if (!Reg || !TargetRegisterInfo::isPhysicalRegister(Reg)) continue;
7128c70ea47fae6d61441d150cbe9431cf5e06222e5Jakob Stoklund Olesen    for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI) {
713d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen      UsedInInstr.insert(*AI);
7148c70ea47fae6d61441d150cbe9431cf5e06222e5Jakob Stoklund Olesen      if (ThroughRegs.count(PhysRegState[*AI]))
7158c70ea47fae6d61441d150cbe9431cf5e06222e5Jakob Stoklund Olesen        definePhysReg(MI, *AI, regFree);
716d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    }
717d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen  }
718d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen
719d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen  SmallVector<unsigned, 8> PartialDefs;
720254a13282c97469973b4fa8cc0e110ed6160642cRafael Espindola  DEBUG(dbgs() << "Allocating tied uses.\n");
721d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
722d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    MachineOperand &MO = MI->getOperand(i);
723d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    if (!MO.isReg()) continue;
724d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    unsigned Reg = MO.getReg();
725c9df025e33ac435adb3b3318d237c36ca7cec659Jakob Stoklund Olesen    if (!TargetRegisterInfo::isVirtualRegister(Reg)) continue;
726d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    if (MO.isUse()) {
727d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen      unsigned DefIdx = 0;
728d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen      if (!MI->isRegTiedToDefOperand(i, &DefIdx)) continue;
729d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen      DEBUG(dbgs() << "Operand " << i << "("<< MO << ") is tied to operand "
730d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen        << DefIdx << ".\n");
731d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen      LiveRegMap::iterator LRI = reloadVirtReg(MI, i, Reg, 0);
732a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen      unsigned PhysReg = LRI->PhysReg;
733d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen      setPhysReg(MI, i, PhysReg);
734d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen      // Note: we don't update the def operand yet. That would cause the normal
735d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen      // def-scan to attempt spilling.
736d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen    } else if (MO.getSubReg() && MI->readsVirtualRegister(Reg)) {
737d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen      DEBUG(dbgs() << "Partial redefine: " << MO << "\n");
738d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen      // Reload the register, but don't assign to the operand just yet.
739d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen      // That would confuse the later phys-def processing pass.
740d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen      LiveRegMap::iterator LRI = reloadVirtReg(MI, i, Reg, 0);
741a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen      PartialDefs.push_back(LRI->PhysReg);
742d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    }
743d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen  }
744d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen
745254a13282c97469973b4fa8cc0e110ed6160642cRafael Espindola  DEBUG(dbgs() << "Allocating early clobbers.\n");
746254a13282c97469973b4fa8cc0e110ed6160642cRafael Espindola  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
747254a13282c97469973b4fa8cc0e110ed6160642cRafael Espindola    MachineOperand &MO = MI->getOperand(i);
748254a13282c97469973b4fa8cc0e110ed6160642cRafael Espindola    if (!MO.isReg()) continue;
749254a13282c97469973b4fa8cc0e110ed6160642cRafael Espindola    unsigned Reg = MO.getReg();
750254a13282c97469973b4fa8cc0e110ed6160642cRafael Espindola    if (!TargetRegisterInfo::isVirtualRegister(Reg)) continue;
751254a13282c97469973b4fa8cc0e110ed6160642cRafael Espindola    if (!MO.isEarlyClobber())
752254a13282c97469973b4fa8cc0e110ed6160642cRafael Espindola      continue;
753254a13282c97469973b4fa8cc0e110ed6160642cRafael Espindola    // Note: defineVirtReg may invalidate MO.
754254a13282c97469973b4fa8cc0e110ed6160642cRafael Espindola    LiveRegMap::iterator LRI = defineVirtReg(MI, i, Reg, 0);
755a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen    unsigned PhysReg = LRI->PhysReg;
756254a13282c97469973b4fa8cc0e110ed6160642cRafael Espindola    if (setPhysReg(MI, i, PhysReg))
757254a13282c97469973b4fa8cc0e110ed6160642cRafael Espindola      VirtDead.push_back(Reg);
758254a13282c97469973b4fa8cc0e110ed6160642cRafael Espindola  }
759254a13282c97469973b4fa8cc0e110ed6160642cRafael Espindola
760d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen  // Restore UsedInInstr to a state usable for allocating normal virtual uses.
761d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen  UsedInInstr.clear();
762d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
763d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    MachineOperand &MO = MI->getOperand(i);
764d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    if (!MO.isReg() || (MO.isDef() && !MO.isEarlyClobber())) continue;
765d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    unsigned Reg = MO.getReg();
766d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    if (!Reg || !TargetRegisterInfo::isPhysicalRegister(Reg)) continue;
76727ce3b96e51887995f94d8c78a6c7e79bf7cdcddJakob Stoklund Olesen    DEBUG(dbgs() << "\tSetting " << PrintReg(Reg, TRI)
76827ce3b96e51887995f94d8c78a6c7e79bf7cdcddJakob Stoklund Olesen                 << " as used in instr\n");
769d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen    UsedInInstr.insert(Reg);
770d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen  }
771d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen
772d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen  // Also mark PartialDefs as used to avoid reallocation.
773d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen  for (unsigned i = 0, e = PartialDefs.size(); i != e; ++i)
774d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen    UsedInInstr.insert(PartialDefs[i]);
775d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen}
776d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen
777b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick/// addRetOperand - ensure that a return instruction has an operand for each
778b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick/// value live out of the function.
779b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick///
780b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick/// Things marked both call and return are tail calls; do not do this for them.
781b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick/// The tail callee need not take the same registers as input that it produces
782b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick/// as output, and there are dependencies for its input registers elsewhere.
783b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick///
784b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick/// FIXME: This should be done as part of instruction selection, and this helper
785b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick/// should be deleted. Until then, we use custom logic here to create the proper
786b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick/// operand under all circumstances. We can't use addRegisterKilled because that
787b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick/// doesn't make sense for undefined values. We can't simply avoid calling it
788b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick/// for undefined values, because we must ensure that the operand always exists.
789b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trickvoid RAFast::addRetOperands(MachineBasicBlock *MBB) {
790b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick  if (MBB->empty() || !MBB->back().isReturn() || MBB->back().isCall())
791b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick    return;
79200207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
793b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick  MachineInstr *MI = &MBB->back();
794b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick
795b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick  for (MachineRegisterInfo::liveout_iterator
796b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick         I = MBB->getParent()->getRegInfo().liveout_begin(),
797b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick         E = MBB->getParent()->getRegInfo().liveout_end(); I != E; ++I) {
798b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick    unsigned Reg = *I;
799b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick    assert(TargetRegisterInfo::isPhysicalRegister(Reg) &&
800b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick           "Cannot have a live-out virtual register.");
801b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick
802b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick    bool hasDef = PhysRegState[Reg] == regReserved;
803b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick
804b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick    // Check if this register already has an operand.
805b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick    bool Found = false;
806b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick    for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
807b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick      MachineOperand &MO = MI->getOperand(i);
808b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick      if (!MO.isReg() || !MO.isUse())
809b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick        continue;
810b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick
811b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick      unsigned OperReg = MO.getReg();
812ab78e20ce085763b4fc9948eaa715fb7e49341c8Andrew Trick      if (!TargetRegisterInfo::isPhysicalRegister(OperReg))
813ab78e20ce085763b4fc9948eaa715fb7e49341c8Andrew Trick        continue;
814ab78e20ce085763b4fc9948eaa715fb7e49341c8Andrew Trick
815ab78e20ce085763b4fc9948eaa715fb7e49341c8Andrew Trick      if (OperReg == Reg || TRI->isSuperRegister(OperReg, Reg)) {
816ab78e20ce085763b4fc9948eaa715fb7e49341c8Andrew Trick        // If the ret already has an operand for this physreg or a superset,
817ab78e20ce085763b4fc9948eaa715fb7e49341c8Andrew Trick        // don't duplicate it. Set the kill flag if the value is defined.
818ab78e20ce085763b4fc9948eaa715fb7e49341c8Andrew Trick        if (hasDef && !MO.isKill())
819ab78e20ce085763b4fc9948eaa715fb7e49341c8Andrew Trick          MO.setIsKill();
820ab78e20ce085763b4fc9948eaa715fb7e49341c8Andrew Trick        Found = true;
821ab78e20ce085763b4fc9948eaa715fb7e49341c8Andrew Trick        break;
822b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick      }
823c57ef561423f1ac7f2db5b1840d5681f18a4c0c8Nick Lewycky    }
824b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick    if (!Found)
825b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick      MI->addOperand(MachineOperand::CreateReg(Reg,
826b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick                                               false /*IsDef*/,
827b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick                                               true  /*IsImp*/,
828b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick                                               hasDef/*IsKill*/));
829c57ef561423f1ac7f2db5b1840d5681f18a4c0c8Nick Lewycky  }
830b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick}
831b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick
832b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trickvoid RAFast::AllocateBasicBlock() {
833b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick  DEBUG(dbgs() << "\nAllocating " << *MBB);
834c57ef561423f1ac7f2db5b1840d5681f18a4c0c8Nick Lewycky
835bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen  PhysRegState.assign(TRI->getNumRegs(), regDisabled);
836a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  assert(LiveVirtRegs.empty() && "Mapping not cleared from last block?");
83700207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
8386fb69d85e9576445e98c4114ee7064deb4476712Jakob Stoklund Olesen  MachineBasicBlock::iterator MII = MBB->begin();
839bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen
840bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen  // Add live-in registers as live.
8416fb69d85e9576445e98c4114ee7064deb4476712Jakob Stoklund Olesen  for (MachineBasicBlock::livein_iterator I = MBB->livein_begin(),
8426fb69d85e9576445e98c4114ee7064deb4476712Jakob Stoklund Olesen         E = MBB->livein_end(); I != E; ++I)
84314d1dd95c7c969e07defebb6fe65df2fae1b30cfJakob Stoklund Olesen    if (MRI->isAllocatable(*I))
8449d4b51b696e27b9c061955d4c76f9dbff529b143Jakob Stoklund Olesen      definePhysReg(MII, *I, regReserved);
845bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen
846d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen  SmallVector<unsigned, 8> VirtDead;
8477ff82e1501c416552125f77a62edebe576e469b0Jakob Stoklund Olesen  SmallVector<MachineInstr*, 32> Coalesced;
84800207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
84900207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  // Otherwise, sequentially allocate each instruction in the MBB.
8506fb69d85e9576445e98c4114ee7064deb4476712Jakob Stoklund Olesen  while (MII != MBB->end()) {
85100207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen    MachineInstr *MI = MII++;
852e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng    const MCInstrDesc &MCID = MI->getDesc();
85300207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen    DEBUG({
854c9c4dacd03a4b80d61ed6b9c6ffeb1b1f76b8d1cJakob Stoklund Olesen        dbgs() << "\n>> " << *MI << "Regs:";
855bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen        for (unsigned Reg = 1, E = TRI->getNumRegs(); Reg != E; ++Reg) {
856bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen          if (PhysRegState[Reg] == regDisabled) continue;
857bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen          dbgs() << " " << TRI->getName(Reg);
858bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen          switch(PhysRegState[Reg]) {
859bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen          case regFree:
860bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen            break;
861bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen          case regReserved:
862c9c4dacd03a4b80d61ed6b9c6ffeb1b1f76b8d1cJakob Stoklund Olesen            dbgs() << "*";
863bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen            break;
864a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen          default: {
8654314268128be6d54c9a7f0709680e5a5b40f3ab3Jakob Stoklund Olesen            dbgs() << '=' << PrintReg(PhysRegState[Reg]);
866a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen            LiveRegMap::iterator I = findLiveVirtReg(PhysRegState[Reg]);
867a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen            assert(I != LiveVirtRegs.end() && "Missing VirtReg entry");
868a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen            if (I->Dirty)
869bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen              dbgs() << "*";
870a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen            assert(I->PhysReg == Reg && "Bad inverse map");
871bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen            break;
872bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen          }
873a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen          }
874bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen        }
87500207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen        dbgs() << '\n';
87676b4d5a0210f161c08543f00f355955c94d3f2ecJakob Stoklund Olesen        // Check that LiveVirtRegs is the inverse.
87776b4d5a0210f161c08543f00f355955c94d3f2ecJakob Stoklund Olesen        for (LiveRegMap::iterator i = LiveVirtRegs.begin(),
87876b4d5a0210f161c08543f00f355955c94d3f2ecJakob Stoklund Olesen             e = LiveVirtRegs.end(); i != e; ++i) {
879a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen           assert(TargetRegisterInfo::isVirtualRegister(i->VirtReg) &&
880bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen                  "Bad map key");
881a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen           assert(TargetRegisterInfo::isPhysicalRegister(i->PhysReg) &&
882bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen                  "Bad map value");
883a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen           assert(PhysRegState[i->PhysReg] == i->VirtReg && "Bad inverse map");
884bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen        }
88500207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen      });
88600207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
887bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    // Debug values are not allowed to change codegen in any way.
888bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    if (MI->isDebugValue()) {
88958b8176ed39038240984c0966fef847fe37c86c1Devang Patel      bool ScanDbgValue = true;
89058b8176ed39038240984c0966fef847fe37c86c1Devang Patel      while (ScanDbgValue) {
89158b8176ed39038240984c0966fef847fe37c86c1Devang Patel        ScanDbgValue = false;
89258b8176ed39038240984c0966fef847fe37c86c1Devang Patel        for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
89358b8176ed39038240984c0966fef847fe37c86c1Devang Patel          MachineOperand &MO = MI->getOperand(i);
89458b8176ed39038240984c0966fef847fe37c86c1Devang Patel          if (!MO.isReg()) continue;
89558b8176ed39038240984c0966fef847fe37c86c1Devang Patel          unsigned Reg = MO.getReg();
896c9df025e33ac435adb3b3318d237c36ca7cec659Jakob Stoklund Olesen          if (!TargetRegisterInfo::isVirtualRegister(Reg)) continue;
897a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen          LiveRegMap::iterator LRI = findLiveVirtReg(Reg);
89858b8176ed39038240984c0966fef847fe37c86c1Devang Patel          if (LRI != LiveVirtRegs.end())
899a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen            setPhysReg(MI, i, LRI->PhysReg);
9007a029b6d7e58cb0f1010f14d99d7661e387cfb54Devang Patel          else {
90158b8176ed39038240984c0966fef847fe37c86c1Devang Patel            int SS = StackSlotForVirtReg[Reg];
9024bafda9618f9dfa9edc8da08bb3001ef2d1a9b68Devang Patel            if (SS == -1) {
90307cb689d6260b78861d829bb05b188e1558c528eJim Grosbach              // We can't allocate a physreg for a DebugValue, sorry!
9044bafda9618f9dfa9edc8da08bb3001ef2d1a9b68Devang Patel              DEBUG(dbgs() << "Unable to allocate vreg used by DBG_VALUE");
90507cb689d6260b78861d829bb05b188e1558c528eJim Grosbach              MO.setReg(0);
9064bafda9618f9dfa9edc8da08bb3001ef2d1a9b68Devang Patel            }
90758b8176ed39038240984c0966fef847fe37c86c1Devang Patel            else {
90858b8176ed39038240984c0966fef847fe37c86c1Devang Patel              // Modify DBG_VALUE now that the value is in a spill slot.
909459a36bd34809ffc5d74de79b3e46f6e02e5184fDevang Patel              int64_t Offset = MI->getOperand(1).getImm();
91007cb689d6260b78861d829bb05b188e1558c528eJim Grosbach              const MDNode *MDPtr =
91158b8176ed39038240984c0966fef847fe37c86c1Devang Patel                MI->getOperand(MI->getNumOperands()-1).getMetadata();
91258b8176ed39038240984c0966fef847fe37c86c1Devang Patel              DebugLoc DL = MI->getDebugLoc();
91307cb689d6260b78861d829bb05b188e1558c528eJim Grosbach              if (MachineInstr *NewDV =
91458b8176ed39038240984c0966fef847fe37c86c1Devang Patel                  TII->emitFrameIndexDebugValue(*MF, SS, Offset, MDPtr, DL)) {
91507cb689d6260b78861d829bb05b188e1558c528eJim Grosbach                DEBUG(dbgs() << "Modifying debug info due to spill:" <<
91607cb689d6260b78861d829bb05b188e1558c528eJim Grosbach                      "\t" << *MI);
91758b8176ed39038240984c0966fef847fe37c86c1Devang Patel                MachineBasicBlock *MBB = MI->getParent();
91858b8176ed39038240984c0966fef847fe37c86c1Devang Patel                MBB->insert(MBB->erase(MI), NewDV);
91958b8176ed39038240984c0966fef847fe37c86c1Devang Patel                // Scan NewDV operands from the beginning.
92058b8176ed39038240984c0966fef847fe37c86c1Devang Patel                MI = NewDV;
92158b8176ed39038240984c0966fef847fe37c86c1Devang Patel                ScanDbgValue = true;
92258b8176ed39038240984c0966fef847fe37c86c1Devang Patel                break;
9234bafda9618f9dfa9edc8da08bb3001ef2d1a9b68Devang Patel              } else {
92407cb689d6260b78861d829bb05b188e1558c528eJim Grosbach                // We can't allocate a physreg for a DebugValue; sorry!
9254bafda9618f9dfa9edc8da08bb3001ef2d1a9b68Devang Patel                DEBUG(dbgs() << "Unable to allocate vreg used by DBG_VALUE");
92607cb689d6260b78861d829bb05b188e1558c528eJim Grosbach                MO.setReg(0);
9274bafda9618f9dfa9edc8da08bb3001ef2d1a9b68Devang Patel              }
92858b8176ed39038240984c0966fef847fe37c86c1Devang Patel            }
9297a029b6d7e58cb0f1010f14d99d7661e387cfb54Devang Patel          }
930d2df64f56970aa07d2d8733543e4baf6c7009e91Devang Patel          LiveDbgValueMap[Reg].push_back(MI);
9317a029b6d7e58cb0f1010f14d99d7661e387cfb54Devang Patel        }
93200207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen      }
933bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      // Next instruction.
934bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      continue;
93500207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen    }
93600207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
9374bf4bafcced902ee6d58a90486768f08a3795d02Jakob Stoklund Olesen    // If this is a copy, we may be able to coalesce.
93804c528a0c86ddf3d6a70681f72e1b2ec07b0b53aJakob Stoklund Olesen    unsigned CopySrc = 0, CopyDst = 0, CopySrcSub = 0, CopyDstSub = 0;
939273f7e42994a5bce0614d04d96dbfdf05fd652e5Jakob Stoklund Olesen    if (MI->isCopy()) {
940273f7e42994a5bce0614d04d96dbfdf05fd652e5Jakob Stoklund Olesen      CopyDst = MI->getOperand(0).getReg();
941273f7e42994a5bce0614d04d96dbfdf05fd652e5Jakob Stoklund Olesen      CopySrc = MI->getOperand(1).getReg();
942273f7e42994a5bce0614d04d96dbfdf05fd652e5Jakob Stoklund Olesen      CopyDstSub = MI->getOperand(0).getSubReg();
943273f7e42994a5bce0614d04d96dbfdf05fd652e5Jakob Stoklund Olesen      CopySrcSub = MI->getOperand(1).getSubReg();
94404c528a0c86ddf3d6a70681f72e1b2ec07b0b53aJakob Stoklund Olesen    }
9454bf4bafcced902ee6d58a90486768f08a3795d02Jakob Stoklund Olesen
946bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    // Track registers used by instruction.
947d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen    UsedInInstr.clear();
94800207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
949bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    // First scan.
950bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    // Mark physreg uses and early clobbers as used.
951e97dda4fc58ee401ebb4aa9153d10f8ce8ba9a70Jakob Stoklund Olesen    // Find the end of the virtreg operands
952e97dda4fc58ee401ebb4aa9153d10f8ce8ba9a70Jakob Stoklund Olesen    unsigned VirtOpEnd = 0;
953d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen    bool hasTiedOps = false;
954d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen    bool hasEarlyClobbers = false;
955d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen    bool hasPartialRedefs = false;
956d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen    bool hasPhysDefs = false;
957bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
95800207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen      MachineOperand &MO = MI->getOperand(i);
959bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      if (!MO.isReg()) continue;
960bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      unsigned Reg = MO.getReg();
961e97dda4fc58ee401ebb4aa9153d10f8ce8ba9a70Jakob Stoklund Olesen      if (!Reg) continue;
962e97dda4fc58ee401ebb4aa9153d10f8ce8ba9a70Jakob Stoklund Olesen      if (TargetRegisterInfo::isVirtualRegister(Reg)) {
963e97dda4fc58ee401ebb4aa9153d10f8ce8ba9a70Jakob Stoklund Olesen        VirtOpEnd = i+1;
964d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen        if (MO.isUse()) {
965d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen          hasTiedOps = hasTiedOps ||
966e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng                              MCID.getOperandConstraint(i, MCOI::TIED_TO) != -1;
967d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen        } else {
968d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen          if (MO.isEarlyClobber())
969d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen            hasEarlyClobbers = true;
970d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen          if (MO.getSubReg() && MI->readsVirtualRegister(Reg))
971d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen            hasPartialRedefs = true;
972d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen        }
973e97dda4fc58ee401ebb4aa9153d10f8ce8ba9a70Jakob Stoklund Olesen        continue;
974e97dda4fc58ee401ebb4aa9153d10f8ce8ba9a70Jakob Stoklund Olesen      }
97514d1dd95c7c969e07defebb6fe65df2fae1b30cfJakob Stoklund Olesen      if (!MRI->isAllocatable(Reg)) continue;
976bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      if (MO.isUse()) {
9774ed10826833701b14064f55b6514289e0a7ff5efJakob Stoklund Olesen        usePhysReg(MO);
978bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      } else if (MO.isEarlyClobber()) {
97975ac4d9c2dfb22f84da25dec03df7a07f3dad1faJakob Stoklund Olesen        definePhysReg(MI, Reg, (MO.isImplicit() || MO.isDead()) ?
98075ac4d9c2dfb22f84da25dec03df7a07f3dad1faJakob Stoklund Olesen                               regFree : regReserved);
981d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen        hasEarlyClobbers = true;
982d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen      } else
983d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen        hasPhysDefs = true;
984d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    }
985d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen
986d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    // The instruction may have virtual register operands that must be allocated
987d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    // the same register at use-time and def-time: early clobbers and tied
988d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    // operands. If there are also physical defs, these registers must avoid
989d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    // both physical defs and uses, making them more constrained than normal
990d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    // operands.
99107cb689d6260b78861d829bb05b188e1558c528eJim Grosbach    // Similarly, if there are multiple defs and tied operands, we must make
99207cb689d6260b78861d829bb05b188e1558c528eJim Grosbach    // sure the same register is allocated to uses and defs.
993d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    // We didn't detect inline asm tied operands above, so just make this extra
994d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    // pass for all inline asm.
995d1303d2a66241c70e0e35dac371636c883235df8Jakob Stoklund Olesen    if (MI->isInlineAsm() || hasEarlyClobbers || hasPartialRedefs ||
996e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng        (hasTiedOps && (hasPhysDefs || MCID.getNumDefs() > 1))) {
997d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen      handleThroughOperands(MI, VirtDead);
998d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen      // Don't attempt coalescing when we have funny stuff going on.
999d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen      CopyDst = 0;
10004bd94f7bbe2ed6e0d83d03b06c0d20bb346abecaJakob Stoklund Olesen      // Pretend we have early clobbers so the use operands get marked below.
10014bd94f7bbe2ed6e0d83d03b06c0d20bb346abecaJakob Stoklund Olesen      // This is not necessary for the common case of a single tied use.
10024bd94f7bbe2ed6e0d83d03b06c0d20bb346abecaJakob Stoklund Olesen      hasEarlyClobbers = true;
100300207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen    }
100400207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
1005bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    // Second scan.
1006d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    // Allocate virtreg uses.
1007e97dda4fc58ee401ebb4aa9153d10f8ce8ba9a70Jakob Stoklund Olesen    for (unsigned i = 0; i != VirtOpEnd; ++i) {
100800207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen      MachineOperand &MO = MI->getOperand(i);
1009bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      if (!MO.isReg()) continue;
101000207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen      unsigned Reg = MO.getReg();
1011c9df025e33ac435adb3b3318d237c36ca7cec659Jakob Stoklund Olesen      if (!TargetRegisterInfo::isVirtualRegister(Reg)) continue;
1012bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      if (MO.isUse()) {
1013646dd7c899ea213301e193a25536a4bceebf7937Jakob Stoklund Olesen        LiveRegMap::iterator LRI = reloadVirtReg(MI, i, Reg, CopyDst);
1014a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen        unsigned PhysReg = LRI->PhysReg;
10157ff82e1501c416552125f77a62edebe576e469b0Jakob Stoklund Olesen        CopySrc = (CopySrc == Reg || CopySrc == PhysReg) ? PhysReg : 0;
10160eeb05c969c6c314ca7991a10627451762787e2dJakob Stoklund Olesen        if (setPhysReg(MI, i, PhysReg))
1017646dd7c899ea213301e193a25536a4bceebf7937Jakob Stoklund Olesen          killVirtReg(LRI);
101800207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen      }
101900207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen    }
102000207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
1021d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen    for (UsedInInstrSet::iterator
1022d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen         I = UsedInInstr.begin(), E = UsedInInstr.end(); I != E; ++I)
1023d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen      MRI->setPhysRegUsed(*I);
102482b07dc4995d48065bd95affff4d8513a5cad4f2Jakob Stoklund Olesen
10254bd94f7bbe2ed6e0d83d03b06c0d20bb346abecaJakob Stoklund Olesen    // Track registers defined by instruction - early clobbers and tied uses at
10264bd94f7bbe2ed6e0d83d03b06c0d20bb346abecaJakob Stoklund Olesen    // this point.
1027d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen    UsedInInstr.clear();
1028d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen    if (hasEarlyClobbers) {
1029d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen      for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
1030d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen        MachineOperand &MO = MI->getOperand(i);
10314bd94f7bbe2ed6e0d83d03b06c0d20bb346abecaJakob Stoklund Olesen        if (!MO.isReg()) continue;
1032d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen        unsigned Reg = MO.getReg();
1033d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen        if (!Reg || !TargetRegisterInfo::isPhysicalRegister(Reg)) continue;
10344bd94f7bbe2ed6e0d83d03b06c0d20bb346abecaJakob Stoklund Olesen        // Look for physreg defs and tied uses.
10354bd94f7bbe2ed6e0d83d03b06c0d20bb346abecaJakob Stoklund Olesen        if (!MO.isDef() && !MI->isRegTiedToDefOperand(i)) continue;
10368c70ea47fae6d61441d150cbe9431cf5e06222e5Jakob Stoklund Olesen        for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI)
1037d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen          UsedInInstr.insert(*AI);
1038d843b3925fdc275b262ddc2ff8fabc8c98f9a5a0Jakob Stoklund Olesen      }
103900207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen    }
104000207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
10414b6bbe885d851b1cfba2be9b5efc6365a2b7828aJakob Stoklund Olesen    unsigned DefOpEnd = MI->getNumOperands();
10425a96b3dad2f634c9081c8b2b6c2575441dc5a2bdEvan Cheng    if (MI->isCall()) {
10434b6bbe885d851b1cfba2be9b5efc6365a2b7828aJakob Stoklund Olesen      // Spill all virtregs before a call. This serves two purposes: 1. If an
104407cb689d6260b78861d829bb05b188e1558c528eJim Grosbach      // exception is thrown, the landing pad is going to expect to find
104507cb689d6260b78861d829bb05b188e1558c528eJim Grosbach      // registers in their spill slots, and 2. we don't have to wade through
104607cb689d6260b78861d829bb05b188e1558c528eJim Grosbach      // all the <imp-def> operands on the call instruction.
10474b6bbe885d851b1cfba2be9b5efc6365a2b7828aJakob Stoklund Olesen      DefOpEnd = VirtOpEnd;
10484b6bbe885d851b1cfba2be9b5efc6365a2b7828aJakob Stoklund Olesen      DEBUG(dbgs() << "  Spilling remaining registers before call.\n");
10494b6bbe885d851b1cfba2be9b5efc6365a2b7828aJakob Stoklund Olesen      spillAll(MI);
10506de07178e1e6445080bf4f7704e274c5f219ff70Jakob Stoklund Olesen
10516de07178e1e6445080bf4f7704e274c5f219ff70Jakob Stoklund Olesen      // The imp-defs are skipped below, but we still need to mark those
10526de07178e1e6445080bf4f7704e274c5f219ff70Jakob Stoklund Olesen      // registers as used by the function.
1053e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng      SkippedInstrs.insert(&MCID);
10544b6bbe885d851b1cfba2be9b5efc6365a2b7828aJakob Stoklund Olesen    }
10554b6bbe885d851b1cfba2be9b5efc6365a2b7828aJakob Stoklund Olesen
1056bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    // Third scan.
1057bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen    // Allocate defs and collect dead defs.
10584b6bbe885d851b1cfba2be9b5efc6365a2b7828aJakob Stoklund Olesen    for (unsigned i = 0; i != DefOpEnd; ++i) {
105900207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen      MachineOperand &MO = MI->getOperand(i);
106075ac4d9c2dfb22f84da25dec03df7a07f3dad1faJakob Stoklund Olesen      if (!MO.isReg() || !MO.isDef() || !MO.getReg() || MO.isEarlyClobber())
106175ac4d9c2dfb22f84da25dec03df7a07f3dad1faJakob Stoklund Olesen        continue;
1062bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      unsigned Reg = MO.getReg();
106300207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
1064bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen      if (TargetRegisterInfo::isPhysicalRegister(Reg)) {
106514d1dd95c7c969e07defebb6fe65df2fae1b30cfJakob Stoklund Olesen        if (!MRI->isAllocatable(Reg)) continue;
10666fb69d85e9576445e98c4114ee7064deb4476712Jakob Stoklund Olesen        definePhysReg(MI, Reg, (MO.isImplicit() || MO.isDead()) ?
10676fb69d85e9576445e98c4114ee7064deb4476712Jakob Stoklund Olesen                               regFree : regReserved);
1068bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen        continue;
106900207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen      }
1070646dd7c899ea213301e193a25536a4bceebf7937Jakob Stoklund Olesen      LiveRegMap::iterator LRI = defineVirtReg(MI, i, Reg, CopySrc);
1071a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen      unsigned PhysReg = LRI->PhysReg;
10720eeb05c969c6c314ca7991a10627451762787e2dJakob Stoklund Olesen      if (setPhysReg(MI, i, PhysReg)) {
10730eeb05c969c6c314ca7991a10627451762787e2dJakob Stoklund Olesen        VirtDead.push_back(Reg);
10747ff82e1501c416552125f77a62edebe576e469b0Jakob Stoklund Olesen        CopyDst = 0; // cancel coalescing;
10757ff82e1501c416552125f77a62edebe576e469b0Jakob Stoklund Olesen      } else
10767ff82e1501c416552125f77a62edebe576e469b0Jakob Stoklund Olesen        CopyDst = (CopyDst == Reg || CopyDst == PhysReg) ? PhysReg : 0;
107700207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen    }
107800207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
10790eeb05c969c6c314ca7991a10627451762787e2dJakob Stoklund Olesen    // Kill dead defs after the scan to ensure that multiple defs of the same
10800eeb05c969c6c314ca7991a10627451762787e2dJakob Stoklund Olesen    // register are allocated identically. We didn't need to do this for uses
10810eeb05c969c6c314ca7991a10627451762787e2dJakob Stoklund Olesen    // because we are crerating our own kill flags, and they are always at the
10820eeb05c969c6c314ca7991a10627451762787e2dJakob Stoklund Olesen    // last use.
10830eeb05c969c6c314ca7991a10627451762787e2dJakob Stoklund Olesen    for (unsigned i = 0, e = VirtDead.size(); i != e; ++i)
10840eeb05c969c6c314ca7991a10627451762787e2dJakob Stoklund Olesen      killVirtReg(VirtDead[i]);
10850eeb05c969c6c314ca7991a10627451762787e2dJakob Stoklund Olesen    VirtDead.clear();
10860eeb05c969c6c314ca7991a10627451762787e2dJakob Stoklund Olesen
1087d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen    for (UsedInInstrSet::iterator
1088d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen         I = UsedInInstr.begin(), E = UsedInInstr.end(); I != E; ++I)
1089d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen      MRI->setPhysRegUsed(*I);
1090c9c4dacd03a4b80d61ed6b9c6ffeb1b1f76b8d1cJakob Stoklund Olesen
10917ff82e1501c416552125f77a62edebe576e469b0Jakob Stoklund Olesen    if (CopyDst && CopyDst == CopySrc && CopyDstSub == CopySrcSub) {
10927ff82e1501c416552125f77a62edebe576e469b0Jakob Stoklund Olesen      DEBUG(dbgs() << "-- coalescing: " << *MI);
10937ff82e1501c416552125f77a62edebe576e469b0Jakob Stoklund Olesen      Coalesced.push_back(MI);
10947ff82e1501c416552125f77a62edebe576e469b0Jakob Stoklund Olesen    } else {
10957ff82e1501c416552125f77a62edebe576e469b0Jakob Stoklund Olesen      DEBUG(dbgs() << "<< " << *MI);
10967ff82e1501c416552125f77a62edebe576e469b0Jakob Stoklund Olesen    }
109700207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  }
109800207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
1099bbf33b38aaaa6cdbdd2c6a595aa081734308ce83Jakob Stoklund Olesen  // Spill all physical registers holding virtual registers now.
1100e6aba837974f7d2539efad9a09fe06b4d1566e5dJakob Stoklund Olesen  DEBUG(dbgs() << "Spilling live registers at end of block.\n");
1101e6aba837974f7d2539efad9a09fe06b4d1566e5dJakob Stoklund Olesen  spillAll(MBB->getFirstTerminator());
110200207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
11037ff82e1501c416552125f77a62edebe576e469b0Jakob Stoklund Olesen  // Erase all the coalesced copies. We are delaying it until now because
1104e6aba837974f7d2539efad9a09fe06b4d1566e5dJakob Stoklund Olesen  // LiveVirtRegs might refer to the instrs.
11057ff82e1501c416552125f77a62edebe576e469b0Jakob Stoklund Olesen  for (unsigned i = 0, e = Coalesced.size(); i != e; ++i)
11066fb69d85e9576445e98c4114ee7064deb4476712Jakob Stoklund Olesen    MBB->erase(Coalesced[i]);
11078a65c510a4fa1245d101da6318618d025702028cJakob Stoklund Olesen  NumCopies += Coalesced.size();
11087ff82e1501c416552125f77a62edebe576e469b0Jakob Stoklund Olesen
1109b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick  // addRetOperands must run after we've seen all defs in this block.
1110b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick  addRetOperands(MBB);
1111b3d58474c83499621ae1e2d76dc87587910abe55Andrew Trick
11126fb69d85e9576445e98c4114ee7064deb4476712Jakob Stoklund Olesen  DEBUG(MBB->dump());
111300207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen}
111400207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
111500207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen/// runOnMachineFunction - Register allocate the whole function
111600207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen///
111700207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesenbool RAFast::runOnMachineFunction(MachineFunction &Fn) {
1118c9c4dacd03a4b80d61ed6b9c6ffeb1b1f76b8d1cJakob Stoklund Olesen  DEBUG(dbgs() << "********** FAST REGISTER ALLOCATION **********\n"
1119986d76d7b3844b9a2f3d01a48975952749267a93David Blaikie               << "********** Function: " << Fn.getName() << '\n');
112000207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  MF = &Fn;
11214bf4bafcced902ee6d58a90486768f08a3795d02Jakob Stoklund Olesen  MRI = &MF->getRegInfo();
112200207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  TM = &Fn.getTarget();
112300207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  TRI = TM->getRegisterInfo();
112400207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  TII = TM->getInstrInfo();
1125d9e5c764bfea339fc5082bf17e558db959fd6d28Jakob Stoklund Olesen  MRI->freezeReservedRegs(Fn);
11265d20c3152bd7fe91eda1b58a5eb6da7067874c61Jakob Stoklund Olesen  RegClassInfo.runOnMachineFunction(Fn);
1127d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen  UsedInInstr.clear();
1128d7ea7d5cd7518788dea698d38023959480c8263aJakob Stoklund Olesen  UsedInInstr.setUniverse(TRI->getNumRegs());
112900207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
11308dd26253f54247e77e5accfdd70e7b4bf27b39c2Andrew Trick  assert(!MRI->isSSA() && "regalloc requires leaving SSA");
11318dd26253f54247e77e5accfdd70e7b4bf27b39c2Andrew Trick
113200207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  // initialize the virtual->physical register map to have a 'null'
113300207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  // mapping for all virtual registers
113442e9c963921776cb498c33b6c6c03f29971316f3Jakob Stoklund Olesen  StackSlotForVirtReg.resize(MRI->getNumVirtRegs());
1135a240743ad954c657015b3ee3631e30fd6a2e86b2Jakob Stoklund Olesen  LiveVirtRegs.setUniverse(MRI->getNumVirtRegs());
113600207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
113700207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  // Loop over all of the basic blocks, eliminating virtual register references
11386fb69d85e9576445e98c4114ee7064deb4476712Jakob Stoklund Olesen  for (MachineFunction::iterator MBBi = Fn.begin(), MBBe = Fn.end();
11396fb69d85e9576445e98c4114ee7064deb4476712Jakob Stoklund Olesen       MBBi != MBBe; ++MBBi) {
11406fb69d85e9576445e98c4114ee7064deb4476712Jakob Stoklund Olesen    MBB = &*MBBi;
11416fb69d85e9576445e98c4114ee7064deb4476712Jakob Stoklund Olesen    AllocateBasicBlock();
11426fb69d85e9576445e98c4114ee7064deb4476712Jakob Stoklund Olesen  }
114300207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
11446de07178e1e6445080bf4f7704e274c5f219ff70Jakob Stoklund Olesen  // Add the clobber lists for all the instructions we skipped earlier.
1145e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng  for (SmallPtrSet<const MCInstrDesc*, 4>::const_iterator
11466de07178e1e6445080bf4f7704e274c5f219ff70Jakob Stoklund Olesen       I = SkippedInstrs.begin(), E = SkippedInstrs.end(); I != E; ++I)
1147fac259814923d091942b230e7bd002a8d1130bc3Craig Topper    if (const uint16_t *Defs = (*I)->getImplicitDefs())
11486de07178e1e6445080bf4f7704e274c5f219ff70Jakob Stoklund Olesen      while (*Defs)
11496de07178e1e6445080bf4f7704e274c5f219ff70Jakob Stoklund Olesen        MRI->setPhysRegUsed(*Defs++);
11506de07178e1e6445080bf4f7704e274c5f219ff70Jakob Stoklund Olesen
115119273aec441411b4d571fdb87c6daa0fbe7a33a0Andrew Trick  // All machine operands and other references to virtual registers have been
115219273aec441411b4d571fdb87c6daa0fbe7a33a0Andrew Trick  // replaced. Remove the virtual registers.
115319273aec441411b4d571fdb87c6daa0fbe7a33a0Andrew Trick  MRI->clearVirtRegs();
115419273aec441411b4d571fdb87c6daa0fbe7a33a0Andrew Trick
11556de07178e1e6445080bf4f7704e274c5f219ff70Jakob Stoklund Olesen  SkippedInstrs.clear();
115600207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  StackSlotForVirtReg.clear();
1157459a36bd34809ffc5d74de79b3e46f6e02e5184fDevang Patel  LiveDbgValueMap.clear();
115800207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  return true;
115900207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen}
116000207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen
116100207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund OlesenFunctionPass *llvm::createFastRegisterAllocator() {
116200207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen  return new RAFast();
116300207237ddfffe93b275914d086a0c7da1bbf63bJakob Stoklund Olesen}
1164