blob: 9596e0440701fa5723799d4495433a1eed3e1b92 [file] [log] [blame]
Chris Lattner7f74a562002-01-20 22:54:45 +00001/* Title: PhyRegAlloc.h -*- C++ -*-
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +00002 Author: Ruchira Sasanka
3 Date: Aug 20, 01
4 Purpose: This is the main entry point for register allocation.
5
6 Notes:
Ruchira Sasankaf20079d2002-01-07 19:16:26 +00007 =====
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +00008
9 * RegisterClasses: Each RegClass accepts a
Chris Lattnerf9781b52002-12-29 03:13:05 +000010 TargetRegClass which contains machine specific info about that register
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000011 class. The code in the RegClass is machine independent and they use
Chris Lattnerf9781b52002-12-29 03:13:05 +000012 access functions in the TargetRegClass object passed into it to get
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000013 machine specific info.
14
15 * Machine dependent work: All parts of the register coloring algorithm
16 except coloring of an individual node are machine independent.
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000017*/
18
Brian Gaeke58dabb42003-09-21 02:31:25 +000019#ifndef PHYREGALLOC_H
20#define PHYREGALLOC_H
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000021
Chris Lattnere80612a2003-09-01 20:12:17 +000022#include "LiveRangeInfo.h"
Brian Gaekee1061012003-09-21 01:23:46 +000023#include "llvm/Pass.h"
Vikram S. Adve91e75d82003-07-29 19:37:41 +000024#include "llvm/CodeGen/MachineBasicBlock.h"
Brian Gaekee1061012003-09-21 01:23:46 +000025#include "llvm/Target/TargetRegInfo.h"
26#include "llvm/Target/TargetMachine.h"
Chris Lattner50cf8f12002-04-28 20:40:16 +000027#include <map>
28
Misha Brukman7ae7f842002-10-28 00:28:31 +000029class MachineFunction;
Chris Lattnerf9986852002-04-27 07:27:19 +000030class FunctionLiveVarInfo;
Chris Lattnerb0da8b22002-02-04 05:52:08 +000031class MachineInstr;
Chris Lattner002958c2002-04-28 16:19:42 +000032class LoopInfo;
Chris Lattner19a7cb22003-01-15 19:56:21 +000033class RegClass;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +000034
35//----------------------------------------------------------------------------
36// Class AddedInstrns:
37// When register allocator inserts new instructions in to the existing
38// instruction stream, it does NOT directly modify the instruction stream.
39// Rather, it creates an object of AddedInstrns and stick it in the
40// AddedInstrMap for an existing instruction. This class contains two vectors
41// to store such instructions added before and after an existing instruction.
42//----------------------------------------------------------------------------
43
Chris Lattner30e23da2002-04-09 05:13:04 +000044struct AddedInstrns {
Chris Lattnerb1e39b52002-10-28 19:43:23 +000045 std::vector<MachineInstr*> InstrnsBefore;//Insts added BEFORE an existing inst
46 std::vector<MachineInstr*> InstrnsAfter; //Insts added AFTER an existing inst
Brian Gaekee1061012003-09-21 01:23:46 +000047 inline void clear () { InstrnsBefore.clear (); InstrnsAfter.clear (); }
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000048};
49
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +000050//----------------------------------------------------------------------------
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +000051// class PhyRegAlloc:
Brian Gaekee1061012003-09-21 01:23:46 +000052// Main class the register allocator. Call runOnFunction() to allocate
Chris Lattnerf739fa82002-04-08 22:03:57 +000053// registers for a Function.
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +000054//----------------------------------------------------------------------------
55
Brian Gaekee1061012003-09-21 01:23:46 +000056class PhyRegAlloc : public FunctionPass {
Chris Lattner7f74a562002-01-20 22:54:45 +000057 std::vector<RegClass *> RegClassList; // vector of register classes
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000058 const TargetMachine &TM; // target machine
Chris Lattnerb1e39b52002-10-28 19:43:23 +000059 const Function *Fn; // name of the function we work on
Brian Gaekee1061012003-09-21 01:23:46 +000060 MachineFunction *MF; // descriptor for method's native code
61 FunctionLiveVarInfo *LVI; // LV information for this method
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000062 // (already computed for BBs)
Brian Gaekee1061012003-09-21 01:23:46 +000063 LiveRangeInfo *LRI; // LR info (will be computed)
Chris Lattnerf9781b52002-12-29 03:13:05 +000064 const TargetRegInfo &MRI; // Machine Register information
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000065 const unsigned NumOfRegClasses; // recorded here for efficiency
66
Brian Gaekec8a9ec02003-09-16 15:36:50 +000067 // Map to indicate whether operands of each MachineInstr have been
68 // updated according to their assigned colors. This is only used in
69 // assertion checking (debug builds).
Vikram S. Adve24ce4d82003-05-31 07:41:54 +000070 std::map<const MachineInstr *, bool> OperandsColoredMap;
Ruchira Sasankaca632ed2001-11-03 17:14:44 +000071
Chris Lattner76014b92002-10-29 17:08:05 +000072 // AddedInstrMap - Used to store instrns added in this phase
73 std::map<const MachineInstr *, AddedInstrns> AddedInstrMap;
74
Chris Lattner92f5fb52003-08-05 22:09:31 +000075 // ScratchRegsUsed - Contains scratch register uses for a particular MI.
76 typedef std::multimap<const MachineInstr*, int> ScratchRegsUsedTy;
77 ScratchRegsUsedTy ScratchRegsUsed;
78
Vikram S. Adve40221aa2002-04-25 04:46:28 +000079 AddedInstrns AddedInstrAtEntry; // to store instrns added at entry
Brian Gaekee1061012003-09-21 01:23:46 +000080 const LoopInfo *LoopDepthCalc; // to calculate loop depths
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000081
Chris Lattnere62a2a72003-08-05 22:03:27 +000082 PhyRegAlloc(const PhyRegAlloc&); // DO NOT IMPLEMENT
83 void operator=(const PhyRegAlloc&); // DO NOT IMPLEMENT
Chris Lattner669a74c2002-02-04 17:38:48 +000084public:
Brian Gaekee1061012003-09-21 01:23:46 +000085 inline PhyRegAlloc (const TargetMachine &TM_) :
86 TM (TM_), MRI (TM.getRegInfo ()),
87 NumOfRegClasses (MRI.getNumOfRegClasses ()) { }
88 virtual ~PhyRegAlloc() { }
Chris Lattner669a74c2002-02-04 17:38:48 +000089
Brian Gaekee1061012003-09-21 01:23:46 +000090 /// runOnFunction - Main method called for allocating registers.
91 ///
92 virtual bool runOnFunction (Function &F);
Vikram S. Advececde712002-03-18 03:26:48 +000093
Brian Gaekee1061012003-09-21 01:23:46 +000094 virtual void getAnalysisUsage (AnalysisUsage &AU) const {
95 AU.addRequired<LoopInfo> ();
96 AU.addRequired<FunctionLiveVarInfo> ();
97 }
98
99 const char *getPassName () const {
100 return "Traditional graph-coloring reg. allocator";
101 }
Brian Gaeke43593b82003-09-21 02:24:09 +0000102
103 inline const RegClass* getRegClassByID(unsigned id) const {
Vikram S. Adveabcd8d72003-07-25 21:00:13 +0000104 return RegClassList[id];
Vikram S. Advececde712002-03-18 03:26:48 +0000105 }
Brian Gaeke43593b82003-09-21 02:24:09 +0000106 inline RegClass *getRegClassByID(unsigned id) { return RegClassList[id]; }
Vikram S. Adve91e75d82003-07-29 19:37:41 +0000107
Chris Lattner669a74c2002-02-04 17:38:48 +0000108private:
Chris Lattnerb1def732002-02-05 02:51:01 +0000109 void addInterference(const Value *Def, const ValueSet *LVSet,
110 bool isCallInst);
Brian Gaekee1061012003-09-21 01:23:46 +0000111 bool markAllocatedRegs(MachineInstr* MInst);
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000112
113 void addInterferencesForArgs();
114 void createIGNodeListsAndIGs();
115 void buildInterferenceGraphs();
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000116
Chris Lattnere62a2a72003-08-05 22:03:27 +0000117 void setCallInterferences(const MachineInstr *MI,
118 const ValueSet *LVSetAft);
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000119
Ruchira Sasanka33b0d852001-10-23 21:38:42 +0000120 void move2DelayedInstr(const MachineInstr *OrigMI,
Chris Lattnere62a2a72003-08-05 22:03:27 +0000121 const MachineInstr *DelayedMI);
Ruchira Sasanka33b0d852001-10-23 21:38:42 +0000122
Ruchira Sasanka53516cd2001-10-19 21:42:06 +0000123 void markUnusableSugColors();
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000124 void allocateStackSpace4SpilledLRs();
125
Chris Lattnere62a2a72003-08-05 22:03:27 +0000126 void insertCode4SpilledLR(const LiveRange *LR,
127 MachineBasicBlock::iterator& MII,
128 MachineBasicBlock &MBB, unsigned OpNum);
Ruchira Sasanka53516cd2001-10-19 21:42:06 +0000129
Vikram S. Adve91e75d82003-07-29 19:37:41 +0000130 // Method for inserting caller saving code. The caller must save all the
131 // volatile registers live across a call.
132 void insertCallerSavingCode(std::vector<MachineInstr*>& instrnsBefore,
133 std::vector<MachineInstr*>& instrnsAfter,
134 MachineInstr *CallMI,
135 const BasicBlock *BB);
136
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000137 void colorIncomingArgs();
Ruchira Sasanka560b0ad2001-09-30 23:19:57 +0000138 void colorCallRetArgs();
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000139 void updateMachineCode();
Vikram S. Adve91e75d82003-07-29 19:37:41 +0000140 void updateInstruction(MachineBasicBlock::iterator& MII,
141 MachineBasicBlock &MBB);
Ruchira Sasanka560b0ad2001-09-30 23:19:57 +0000142
Chris Lattnere62a2a72003-08-05 22:03:27 +0000143 void printLabel(const Value *Val);
Ruchira Sasanka86b2ad42001-09-15 19:08:41 +0000144 void printMachineCode();
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000145
Chris Lattnere62a2a72003-08-05 22:03:27 +0000146 int getUsableUniRegAtMI(int RegType, const ValueSet *LVSetBef,
147 MachineInstr *MI,
Vikram S. Advebeb36402002-07-08 22:39:36 +0000148 std::vector<MachineInstr*>& MIBef,
149 std::vector<MachineInstr*>& MIAft);
150
Vikram S. Adve91e75d82003-07-29 19:37:41 +0000151 // Callback method used to find unused registers.
152 // LVSetBef is the live variable set to search for an unused register.
Chris Lattnere62a2a72003-08-05 22:03:27 +0000153 // If it is not specified, the LV set before the current MI is used.
Vikram S. Adve91e75d82003-07-29 19:37:41 +0000154 // This is sufficient as long as no new copy instructions are generated
155 // to copy the free register to memory.
156 //
Chris Lattnere62a2a72003-08-05 22:03:27 +0000157 int getUnusedUniRegAtMI(RegClass *RC, int RegType,
158 const MachineInstr *MI,
Vikram S. Adve91e75d82003-07-29 19:37:41 +0000159 const ValueSet *LVSetBef = 0);
160
Chris Lattnere62a2a72003-08-05 22:03:27 +0000161 void setRelRegsUsedByThisInst(RegClass *RC, int RegType,
162 const MachineInstr *MI);
Vikram S. Adveabcd8d72003-07-25 21:00:13 +0000163
Chris Lattnere62a2a72003-08-05 22:03:27 +0000164 int getUniRegNotUsedByThisInst(RegClass *RC, int RegType,
165 const MachineInstr *MI);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000166
Chris Lattnere62a2a72003-08-05 22:03:27 +0000167 void addInterf4PseudoInstr(const MachineInstr *MI);
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000168};
169
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000170#endif