blob: c55f8e0009b086d86335f448c71444ba731364c9 [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
Ruchira Sasankaca632ed2001-11-03 17:14:44 +000064
Chris Lattner76014b92002-10-29 17:08:05 +000065 // AddedInstrMap - Used to store instrns added in this phase
66 std::map<const MachineInstr *, AddedInstrns> AddedInstrMap;
67
Vikram S. Adve40221aa2002-04-25 04:46:28 +000068 AddedInstrns AddedInstrAtEntry; // to store instrns added at entry
Chris Lattner002958c2002-04-28 16:19:42 +000069 LoopInfo *LoopDepthCalc; // to calculate loop depths
Chris Lattner19a7cb22003-01-15 19:56:21 +000070 std::vector<unsigned> ResColList; // A set of reserved regs if desired.
Ruchira Sasankaf20079d2002-01-07 19:16:26 +000071 // currently not used
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000072
Chris Lattner669a74c2002-02-04 17:38:48 +000073public:
Chris Lattnerf9986852002-04-27 07:27:19 +000074 PhyRegAlloc(Function *F, const TargetMachine& TM, FunctionLiveVarInfo *Lvi,
Chris Lattner002958c2002-04-28 16:19:42 +000075 LoopInfo *LoopDepthCalc);
Chris Lattner669a74c2002-02-04 17:38:48 +000076 ~PhyRegAlloc();
77
78 // main method called for allocating registers
79 //
80 void allocateRegisters();
Vikram S. Advececde712002-03-18 03:26:48 +000081
82
83 // access to register classes by class ID
84 //
85 const RegClass* getRegClassByID(unsigned int id) const {
86 return RegClassList[id];
87 }
88 RegClass* getRegClassByID(unsigned int id) {
89 return RegClassList[id]; }
90
91
Chris Lattner669a74c2002-02-04 17:38:48 +000092private:
Chris Lattnerb1def732002-02-05 02:51:01 +000093 void addInterference(const Value *Def, const ValueSet *LVSet,
94 bool isCallInst);
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000095
96 void addInterferencesForArgs();
97 void createIGNodeListsAndIGs();
98 void buildInterferenceGraphs();
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +000099
Ruchira Sasanka6275a042001-10-19 17:21:59 +0000100 void setCallInterferences(const MachineInstr *MInst,
Chris Lattnerb1def732002-02-05 02:51:01 +0000101 const ValueSet *LVSetAft );
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000102
Ruchira Sasanka33b0d852001-10-23 21:38:42 +0000103 void move2DelayedInstr(const MachineInstr *OrigMI,
104 const MachineInstr *DelayedMI );
105
Ruchira Sasanka53516cd2001-10-19 21:42:06 +0000106 void markUnusableSugColors();
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000107 void allocateStackSpace4SpilledLRs();
108
Chris Lattner2b48b962001-11-08 20:55:05 +0000109 void insertCode4SpilledLR (const LiveRange *LR,
110 MachineInstr *MInst,
111 const BasicBlock *BB,
112 const unsigned OpNum);
Ruchira Sasanka53516cd2001-10-19 21:42:06 +0000113
Chris Lattner7f74a562002-01-20 22:54:45 +0000114 inline void constructLiveRanges() { LRI.constructLiveRanges(); }
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000115
116 void colorIncomingArgs();
Ruchira Sasanka560b0ad2001-09-30 23:19:57 +0000117 void colorCallRetArgs();
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000118 void updateMachineCode();
Ruchira Sasanka560b0ad2001-09-30 23:19:57 +0000119
Ruchira Sasanka86b2ad42001-09-15 19:08:41 +0000120 void printLabel(const Value *const Val);
121 void printMachineCode();
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000122
Ruchira Sasanka51fc1c22001-11-03 20:41:22 +0000123
Chris Lattner76014b92002-10-29 17:08:05 +0000124 friend class UltraSparcRegInfo; // FIXME: remove this
Ruchira Sasanka51fc1c22001-11-03 20:41:22 +0000125
Vikram S. Advebeb36402002-07-08 22:39:36 +0000126 int getUsableUniRegAtMI(int RegType,
127 const ValueSet *LVSetBef,
128 MachineInstr *MInst,
129 std::vector<MachineInstr*>& MIBef,
130 std::vector<MachineInstr*>& MIAft);
131
Ruchira Sasankadec9bfd2001-11-15 20:22:37 +0000132 int getUnusedUniRegAtMI(RegClass *RC, const MachineInstr *MInst,
Vikram S. Advebeb36402002-07-08 22:39:36 +0000133 const ValueSet *LVSetBef);
Ruchira Sasanka51fc1c22001-11-03 20:41:22 +0000134
Ruchira Sasankadec9bfd2001-11-15 20:22:37 +0000135 void setRelRegsUsedByThisInst(RegClass *RC, const MachineInstr *MInst );
136 int getUniRegNotUsedByThisInst(RegClass *RC, const MachineInstr *MInst);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000137
Ruchira Sasanka7765ca82001-11-14 15:37:13 +0000138 void addInterf4PseudoInstr(const MachineInstr *MInst);
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000139};
140
141
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000142#endif
143