blob: 5922497f11e0e68709f7f67f2b31d79244a74bc9 [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();
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000028*/
29
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000030#ifndef PHY_REG_ALLOC_H
31#define PHY_REG_ALLOC_H
32
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000033#include "llvm/CodeGen/RegClass.h"
34#include "llvm/CodeGen/LiveRangeInfo.h"
Ruchira Sasanka33535772001-10-15 16:22:44 +000035#include <deque>
Chris Lattner6316f382002-02-03 07:13:04 +000036class MachineCodeForMethod;
Chris Lattnerb0da8b22002-02-04 05:52:08 +000037class MachineRegInfo;
38class MethodLiveVarInfo;
39class MachineInstr;
Chris Lattner347a2392002-02-04 17:48:00 +000040namespace cfg { class LoopInfo; }
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +000041
42//----------------------------------------------------------------------------
43// Class AddedInstrns:
44// When register allocator inserts new instructions in to the existing
45// instruction stream, it does NOT directly modify the instruction stream.
46// Rather, it creates an object of AddedInstrns and stick it in the
47// AddedInstrMap for an existing instruction. This class contains two vectors
48// to store such instructions added before and after an existing instruction.
49//----------------------------------------------------------------------------
50
Chris Lattner30e23da2002-04-09 05:13:04 +000051struct AddedInstrns {
Chris Lattner7f74a562002-01-20 22:54:45 +000052 std::deque<MachineInstr*> InstrnsBefore;// Added insts BEFORE an existing inst
53 std::deque<MachineInstr*> InstrnsAfter; // Added insts AFTER an existing inst
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000054};
55
Chris Lattner30e23da2002-04-09 05:13:04 +000056typedef std::map<const MachineInstr *, AddedInstrns> AddedInstrMapType;
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000057
58
59
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +000060//----------------------------------------------------------------------------
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +000061// class PhyRegAlloc:
62// Main class the register allocator. Call allocateRegisters() to allocate
Chris Lattnerf739fa82002-04-08 22:03:57 +000063// registers for a Function.
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +000064//----------------------------------------------------------------------------
65
66
Chris Lattner669a74c2002-02-04 17:38:48 +000067class PhyRegAlloc: public NonCopyable {
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000068
Chris Lattner7f74a562002-01-20 22:54:45 +000069 std::vector<RegClass *> RegClassList; // vector of register classes
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000070 const TargetMachine &TM; // target machine
Chris Lattnerf739fa82002-04-08 22:03:57 +000071 const Function *Meth; // name of the function we work on
Chris Lattner6316f382002-02-03 07:13:04 +000072 MachineCodeForMethod &mcInfo; // descriptor for method's native code
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000073 MethodLiveVarInfo *const LVI; // LV information for this method
74 // (already computed for BBs)
75 LiveRangeInfo LRI; // LR info (will be computed)
76 const MachineRegInfo &MRI; // Machine Register information
77 const unsigned NumOfRegClasses; // recorded here for efficiency
78
Ruchira Sasankaca632ed2001-11-03 17:14:44 +000079
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000080 AddedInstrMapType AddedInstrMap; // to store instrns added in this phase
Vikram S. Adve40221aa2002-04-25 04:46:28 +000081 AddedInstrns AddedInstrAtEntry; // to store instrns added at entry
Chris Lattner347a2392002-02-04 17:48:00 +000082 cfg::LoopInfo *LoopDepthCalc; // to calculate loop depths
Ruchira Sasankaf20079d2002-01-07 19:16:26 +000083 ReservedColorListType ResColList; // A set of reserved regs if desired.
84 // currently not used
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000085
Chris Lattner669a74c2002-02-04 17:38:48 +000086public:
Chris Lattnerf739fa82002-04-08 22:03:57 +000087 PhyRegAlloc(Function *F, const TargetMachine& TM, MethodLiveVarInfo *Lvi,
Chris Lattner347a2392002-02-04 17:48:00 +000088 cfg::LoopInfo *LoopDepthCalc);
Chris Lattner669a74c2002-02-04 17:38:48 +000089 ~PhyRegAlloc();
90
91 // main method called for allocating registers
92 //
93 void allocateRegisters();
Vikram S. Advececde712002-03-18 03:26:48 +000094
95
96 // access to register classes by class ID
97 //
98 const RegClass* getRegClassByID(unsigned int id) const {
99 return RegClassList[id];
100 }
101 RegClass* getRegClassByID(unsigned int id) {
102 return RegClassList[id]; }
103
104
Chris Lattner669a74c2002-02-04 17:38:48 +0000105private:
106
Ruchira Sasankaca632ed2001-11-03 17:14:44 +0000107
Ruchira Sasankaf20079d2002-01-07 19:16:26 +0000108
109 //------- ------------------ private methods---------------------------------
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000110
Chris Lattnerb1def732002-02-05 02:51:01 +0000111 void addInterference(const Value *Def, const ValueSet *LVSet,
112 bool isCallInst);
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000113
114 void addInterferencesForArgs();
115 void createIGNodeListsAndIGs();
116 void buildInterferenceGraphs();
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000117
Ruchira Sasanka6275a042001-10-19 17:21:59 +0000118 void setCallInterferences(const MachineInstr *MInst,
Chris Lattnerb1def732002-02-05 02:51:01 +0000119 const ValueSet *LVSetAft );
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000120
Ruchira Sasanka33b0d852001-10-23 21:38:42 +0000121 void move2DelayedInstr(const MachineInstr *OrigMI,
122 const MachineInstr *DelayedMI );
123
Ruchira Sasanka53516cd2001-10-19 21:42:06 +0000124 void markUnusableSugColors();
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000125 void allocateStackSpace4SpilledLRs();
126
Chris Lattner2b48b962001-11-08 20:55:05 +0000127 void insertCode4SpilledLR (const LiveRange *LR,
128 MachineInstr *MInst,
129 const BasicBlock *BB,
130 const unsigned OpNum);
Ruchira Sasanka53516cd2001-10-19 21:42:06 +0000131
Chris Lattner7f74a562002-01-20 22:54:45 +0000132 inline void constructLiveRanges() { LRI.constructLiveRanges(); }
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000133
134 void colorIncomingArgs();
Ruchira Sasanka560b0ad2001-09-30 23:19:57 +0000135 void colorCallRetArgs();
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000136 void updateMachineCode();
Ruchira Sasanka560b0ad2001-09-30 23:19:57 +0000137
Ruchira Sasanka86b2ad42001-09-15 19:08:41 +0000138 void printLabel(const Value *const Val);
139 void printMachineCode();
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000140
141 friend class UltraSparcRegInfo;
Ruchira Sasanka51fc1c22001-11-03 20:41:22 +0000142
143
Chris Lattnerb1def732002-02-05 02:51:01 +0000144 int getUsableUniRegAtMI(RegClass *RC, int RegType,
Ruchira Sasankadec9bfd2001-11-15 20:22:37 +0000145 const MachineInstr *MInst,
Vikram S. Advececde712002-03-18 03:26:48 +0000146 const ValueSet *LVSetBef, MachineInstr *&MIBef,
147 MachineInstr *&MIAft );
Ruchira Sasanka51fc1c22001-11-03 20:41:22 +0000148
Ruchira Sasankadec9bfd2001-11-15 20:22:37 +0000149 int getUnusedUniRegAtMI(RegClass *RC, const MachineInstr *MInst,
Chris Lattnerb1def732002-02-05 02:51:01 +0000150 const ValueSet *LVSetBef);
Ruchira Sasanka51fc1c22001-11-03 20:41:22 +0000151
Ruchira Sasankadec9bfd2001-11-15 20:22:37 +0000152 void setRelRegsUsedByThisInst(RegClass *RC, const MachineInstr *MInst );
153 int getUniRegNotUsedByThisInst(RegClass *RC, const MachineInstr *MInst);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000154
Ruchira Sasanka7765ca82001-11-14 15:37:13 +0000155 void addInterf4PseudoInstr(const MachineInstr *MInst);
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000156};
157
158
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000159#endif
160