blob: 6871b2d28ada6c7b4fcc39afe0d32f83dad73b58 [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
10 MachineRegClass which contains machine specific info about that register
11 class. The code in the RegClass is machine independent and they use
12 access functions in the MachineRegClass object passed into it to get
13 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.
17
Ruchira Sasankaf20079d2002-01-07 19:16:26 +000018 Register allocation must be done as:
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000019
Ruchira Sasankaf20079d2002-01-07 19:16:26 +000020 MethodLiveVarInfo LVI(*MethodI ); // compute LV info
21 LVI.analyze();
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000022
Ruchira Sasankaf20079d2002-01-07 19:16:26 +000023 TargetMachine &target = ....
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000024
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000025
Ruchira Sasankaf20079d2002-01-07 19:16:26 +000026 PhyRegAlloc PRA(*MethodI, target, &LVI); // allocate regs
27 PRA.allocateRegisters();
28
29
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000030
31*/
32
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000033#ifndef PHY_REG_ALLOC_H
34#define PHY_REG_ALLOC_H
35
36#include "llvm/CodeGen/MachineInstr.h"
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000037#include "llvm/CodeGen/RegClass.h"
38#include "llvm/CodeGen/LiveRangeInfo.h"
39#include "llvm/Analysis/LiveVar/MethodLiveVarInfo.h"
Ruchira Sasankaf20079d2002-01-07 19:16:26 +000040#include "llvm/Analysis/LoopDepth.h"
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000041
Ruchira Sasanka33535772001-10-15 16:22:44 +000042#include <deque>
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000043
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +000044
45//----------------------------------------------------------------------------
46// Class AddedInstrns:
47// When register allocator inserts new instructions in to the existing
48// instruction stream, it does NOT directly modify the instruction stream.
49// Rather, it creates an object of AddedInstrns and stick it in the
50// AddedInstrMap for an existing instruction. This class contains two vectors
51// to store such instructions added before and after an existing instruction.
52//----------------------------------------------------------------------------
53
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000054class AddedInstrns
55{
56 public:
Chris Lattner7f74a562002-01-20 22:54:45 +000057 std::deque<MachineInstr*> InstrnsBefore;// Added insts BEFORE an existing inst
58 std::deque<MachineInstr*> InstrnsAfter; // Added insts AFTER an existing inst
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000059};
60
Chris Lattner7f74a562002-01-20 22:54:45 +000061typedef std::hash_map<const MachineInstr *, AddedInstrns *> AddedInstrMapType;
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000062
63
64
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +000065//----------------------------------------------------------------------------
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +000066// class PhyRegAlloc:
67// Main class the register allocator. Call allocateRegisters() to allocate
68// registers for a Method.
69//----------------------------------------------------------------------------
70
71
Vikram S. Adved9f85982001-11-08 04:48:50 +000072class PhyRegAlloc: public NonCopyable
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000073{
74
Chris Lattner7f74a562002-01-20 22:54:45 +000075 std::vector<RegClass *> RegClassList; // vector of register classes
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000076 const TargetMachine &TM; // target machine
Vikram S. Adved9f85982001-11-08 04:48:50 +000077 const Method* Meth; // name of the method we work on
78 MachineCodeForMethod& mcInfo; // descriptor for method's native code
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000079 MethodLiveVarInfo *const LVI; // LV information for this method
80 // (already computed for BBs)
81 LiveRangeInfo LRI; // LR info (will be computed)
82 const MachineRegInfo &MRI; // Machine Register information
83 const unsigned NumOfRegClasses; // recorded here for efficiency
84
Ruchira Sasankaca632ed2001-11-03 17:14:44 +000085
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000086 AddedInstrMapType AddedInstrMap; // to store instrns added in this phase
Ruchira Sasankaf20079d2002-01-07 19:16:26 +000087 LoopDepthCalculator LoopDepthCalc; // to calculate loop depths
88 ReservedColorListType ResColList; // A set of reserved regs if desired.
89 // currently not used
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000090
Ruchira Sasankaca632ed2001-11-03 17:14:44 +000091
Ruchira Sasankaf20079d2002-01-07 19:16:26 +000092
93 //------- ------------------ private methods---------------------------------
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000094
95 void addInterference(const Value *const Def, const LiveVarSet *const LVSet,
96 const bool isCallInst);
97
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,
103 const LiveVarSet *const 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();
Ruchira Sasanka560b0ad2001-09-30 23:19:57 +0000121
Ruchira Sasanka86b2ad42001-09-15 19:08:41 +0000122 void printLabel(const Value *const Val);
123 void printMachineCode();
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000124
125 friend class UltraSparcRegInfo;
Ruchira Sasanka51fc1c22001-11-03 20:41:22 +0000126
127
Ruchira Sasankadec9bfd2001-11-15 20:22:37 +0000128 int getUsableUniRegAtMI(RegClass *RC, const int RegType,
129 const MachineInstr *MInst,
130 const LiveVarSet *LVSetBef, MachineInstr *MIBef,
131 MachineInstr *MIAft );
Ruchira Sasanka51fc1c22001-11-03 20:41:22 +0000132
Ruchira Sasankadec9bfd2001-11-15 20:22:37 +0000133 int getUnusedUniRegAtMI(RegClass *RC, const MachineInstr *MInst,
Ruchira Sasanka51fc1c22001-11-03 20:41:22 +0000134 const LiveVarSet *LVSetBef);
135
Ruchira Sasankadec9bfd2001-11-15 20:22:37 +0000136 void setRelRegsUsedByThisInst(RegClass *RC, const MachineInstr *MInst );
137 int getUniRegNotUsedByThisInst(RegClass *RC, const MachineInstr *MInst);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000138
Ruchira Sasanka7765ca82001-11-14 15:37:13 +0000139 void addInterf4PseudoInstr(const MachineInstr *MInst);
Ruchira Sasanka51fc1c22001-11-03 20:41:22 +0000140
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000141 public:
Vikram S. Adved9f85982001-11-08 04:48:50 +0000142 PhyRegAlloc(Method *const M, const TargetMachine& TM,
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000143 MethodLiveVarInfo *const Lvi);
Ruchira Sasankaf20079d2002-01-07 19:16:26 +0000144 ~PhyRegAlloc();
145
146 // main method called for allocating registers
147 //
148 void allocateRegisters();
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000149
150};
151
152
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000153#endif
154