blob: dc7772e4a2385bac12ecd2d66c341f070cba4d3f [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
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000019#ifndef PHY_REG_ALLOC_H
20#define PHY_REG_ALLOC_H
21
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000022#include "llvm/CodeGen/LiveRangeInfo.h"
Chris Lattner19a7cb22003-01-15 19:56:21 +000023#include "Support/NonCopyable.h"
Chris Lattner50cf8f12002-04-28 20:40:16 +000024#include <map>
25
Misha Brukman7ae7f842002-10-28 00:28:31 +000026class MachineFunction;
Chris Lattnerf9781b52002-12-29 03:13:05 +000027class TargetRegInfo;
Chris Lattnerf9986852002-04-27 07:27:19 +000028class FunctionLiveVarInfo;
Chris Lattnerb0da8b22002-02-04 05:52:08 +000029class MachineInstr;
Chris Lattner002958c2002-04-28 16:19:42 +000030class LoopInfo;
Chris Lattner19a7cb22003-01-15 19:56:21 +000031class RegClass;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +000032
33//----------------------------------------------------------------------------
34// Class AddedInstrns:
35// When register allocator inserts new instructions in to the existing
36// instruction stream, it does NOT directly modify the instruction stream.
37// Rather, it creates an object of AddedInstrns and stick it in the
38// AddedInstrMap for an existing instruction. This class contains two vectors
39// to store such instructions added before and after an existing instruction.
40//----------------------------------------------------------------------------
41
Chris Lattner30e23da2002-04-09 05:13:04 +000042struct AddedInstrns {
Chris Lattnerb1e39b52002-10-28 19:43:23 +000043 std::vector<MachineInstr*> InstrnsBefore;//Insts added BEFORE an existing inst
44 std::vector<MachineInstr*> InstrnsAfter; //Insts added AFTER an existing inst
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000045};
46
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +000047//----------------------------------------------------------------------------
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +000048// class PhyRegAlloc:
49// Main class the register allocator. Call allocateRegisters() to allocate
Chris Lattnerf739fa82002-04-08 22:03:57 +000050// registers for a Function.
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +000051//----------------------------------------------------------------------------
52
Chris Lattner19a7cb22003-01-15 19:56:21 +000053class PhyRegAlloc : public NonCopyable {
Chris Lattner7f74a562002-01-20 22:54:45 +000054 std::vector<RegClass *> RegClassList; // vector of register classes
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000055 const TargetMachine &TM; // target machine
Chris Lattnerb1e39b52002-10-28 19:43:23 +000056 const Function *Fn; // name of the function we work on
57 MachineFunction &MF; // descriptor for method's native code
Chris Lattner002958c2002-04-28 16:19:42 +000058 FunctionLiveVarInfo *const LVI; // LV information for this method
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000059 // (already computed for BBs)
60 LiveRangeInfo LRI; // LR info (will be computed)
Chris Lattnerf9781b52002-12-29 03:13:05 +000061 const TargetRegInfo &MRI; // Machine Register information
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000062 const unsigned NumOfRegClasses; // recorded here for efficiency
63
Vikram S. Adve24ce4d82003-05-31 07:41:54 +000064 // Map to indicate whether operands of each MachineInstr have been updated
65 // according to their assigned colors. This is primarily for debugging and
66 // could be removed in the long run.
67 std::map<const MachineInstr *, bool> OperandsColoredMap;
Ruchira Sasankaca632ed2001-11-03 17:14:44 +000068
Chris Lattner76014b92002-10-29 17:08:05 +000069 // AddedInstrMap - Used to store instrns added in this phase
70 std::map<const MachineInstr *, AddedInstrns> AddedInstrMap;
71
Vikram S. Adve40221aa2002-04-25 04:46:28 +000072 AddedInstrns AddedInstrAtEntry; // to store instrns added at entry
Chris Lattner002958c2002-04-28 16:19:42 +000073 LoopInfo *LoopDepthCalc; // to calculate loop depths
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000074
Chris Lattner669a74c2002-02-04 17:38:48 +000075public:
Chris Lattnerf9986852002-04-27 07:27:19 +000076 PhyRegAlloc(Function *F, const TargetMachine& TM, FunctionLiveVarInfo *Lvi,
Chris Lattner002958c2002-04-28 16:19:42 +000077 LoopInfo *LoopDepthCalc);
Chris Lattner669a74c2002-02-04 17:38:48 +000078 ~PhyRegAlloc();
79
80 // main method called for allocating registers
81 //
82 void allocateRegisters();
Vikram S. Advececde712002-03-18 03:26:48 +000083
84
85 // access to register classes by class ID
86 //
87 const RegClass* getRegClassByID(unsigned int id) const {
Vikram S. Adveabcd8d72003-07-25 21:00:13 +000088 return RegClassList[id];
Vikram S. Advececde712002-03-18 03:26:48 +000089 }
Vikram S. Adveabcd8d72003-07-25 21:00:13 +000090 RegClass* getRegClassByID(unsigned int id) {
91 return RegClassList[id];
92 }
Vikram S. Advececde712002-03-18 03:26:48 +000093
Chris Lattner669a74c2002-02-04 17:38:48 +000094private:
Chris Lattnerb1def732002-02-05 02:51:01 +000095 void addInterference(const Value *Def, const ValueSet *LVSet,
96 bool isCallInst);
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000097
98 void addInterferencesForArgs();
99 void createIGNodeListsAndIGs();
100 void buildInterferenceGraphs();
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000101
Ruchira Sasanka6275a042001-10-19 17:21:59 +0000102 void setCallInterferences(const MachineInstr *MInst,
Chris Lattnerb1def732002-02-05 02:51:01 +0000103 const ValueSet *LVSetAft );
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000104
Ruchira Sasanka33b0d852001-10-23 21:38:42 +0000105 void move2DelayedInstr(const MachineInstr *OrigMI,
106 const MachineInstr *DelayedMI );
107
Ruchira Sasanka53516cd2001-10-19 21:42:06 +0000108 void markUnusableSugColors();
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000109 void allocateStackSpace4SpilledLRs();
110
Chris Lattner2b48b962001-11-08 20:55:05 +0000111 void insertCode4SpilledLR (const LiveRange *LR,
112 MachineInstr *MInst,
113 const BasicBlock *BB,
114 const unsigned OpNum);
Ruchira Sasanka53516cd2001-10-19 21:42:06 +0000115
Chris Lattner7f74a562002-01-20 22:54:45 +0000116 inline void constructLiveRanges() { LRI.constructLiveRanges(); }
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000117
118 void colorIncomingArgs();
Ruchira Sasanka560b0ad2001-09-30 23:19:57 +0000119 void colorCallRetArgs();
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000120 void updateMachineCode();
Vikram S. Adve24ce4d82003-05-31 07:41:54 +0000121 void updateInstruction(MachineInstr* MInst, BasicBlock* BB);
Ruchira Sasanka560b0ad2001-09-30 23:19:57 +0000122
Ruchira Sasanka86b2ad42001-09-15 19:08:41 +0000123 void printLabel(const Value *const Val);
124 void printMachineCode();
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000125
Ruchira Sasanka51fc1c22001-11-03 20:41:22 +0000126
Chris Lattner76014b92002-10-29 17:08:05 +0000127 friend class UltraSparcRegInfo; // FIXME: remove this
Ruchira Sasanka51fc1c22001-11-03 20:41:22 +0000128
Vikram S. Advebeb36402002-07-08 22:39:36 +0000129 int getUsableUniRegAtMI(int RegType,
130 const ValueSet *LVSetBef,
131 MachineInstr *MInst,
132 std::vector<MachineInstr*>& MIBef,
133 std::vector<MachineInstr*>& MIAft);
134
Vikram S. Adveabcd8d72003-07-25 21:00:13 +0000135 int getUnusedUniRegAtMI(RegClass *RC, const int RegType,
136 const MachineInstr *MInst, const ValueSet *LVSetBef);
Ruchira Sasanka51fc1c22001-11-03 20:41:22 +0000137
Vikram S. Adveabcd8d72003-07-25 21:00:13 +0000138 void setRelRegsUsedByThisInst(RegClass *RC, const int RegType,
139 const MachineInstr *MInst );
140
141 int getUniRegNotUsedByThisInst(RegClass *RC, const int RegType,
142 const MachineInstr *MInst);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000143
Ruchira Sasanka7765ca82001-11-14 15:37:13 +0000144 void addInterf4PseudoInstr(const MachineInstr *MInst);
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000145};
146
147
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000148#endif
149