blob: 38f8dd774b7f943017ec674c80490f81b4a7f53d [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 Sasankaf20079d2002-01-07 19:16:26 +000035#include "llvm/Analysis/LoopDepth.h"
Ruchira Sasanka33535772001-10-15 16:22:44 +000036#include <deque>
Chris Lattner6316f382002-02-03 07:13:04 +000037class MachineCodeForMethod;
Chris Lattnerb0da8b22002-02-04 05:52:08 +000038class MachineRegInfo;
39class MethodLiveVarInfo;
40class MachineInstr;
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
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000051class AddedInstrns
52{
53 public:
Chris Lattner7f74a562002-01-20 22:54:45 +000054 std::deque<MachineInstr*> InstrnsBefore;// Added insts BEFORE an existing inst
55 std::deque<MachineInstr*> InstrnsAfter; // Added insts AFTER an existing inst
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000056};
57
Chris Lattner7f74a562002-01-20 22:54:45 +000058typedef std::hash_map<const MachineInstr *, AddedInstrns *> AddedInstrMapType;
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000059
60
61
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +000062//----------------------------------------------------------------------------
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +000063// class PhyRegAlloc:
64// Main class the register allocator. Call allocateRegisters() to allocate
65// registers for a Method.
66//----------------------------------------------------------------------------
67
68
Vikram S. Adved9f85982001-11-08 04:48:50 +000069class PhyRegAlloc: public NonCopyable
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000070{
71
Chris Lattner7f74a562002-01-20 22:54:45 +000072 std::vector<RegClass *> RegClassList; // vector of register classes
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000073 const TargetMachine &TM; // target machine
Vikram S. Adved9f85982001-11-08 04:48:50 +000074 const Method* Meth; // name of the method we work on
Chris Lattner6316f382002-02-03 07:13:04 +000075 MachineCodeForMethod &mcInfo; // descriptor for method's native code
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000076 MethodLiveVarInfo *const LVI; // LV information for this method
77 // (already computed for BBs)
78 LiveRangeInfo LRI; // LR info (will be computed)
79 const MachineRegInfo &MRI; // Machine Register information
80 const unsigned NumOfRegClasses; // recorded here for efficiency
81
Ruchira Sasankaca632ed2001-11-03 17:14:44 +000082
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000083 AddedInstrMapType AddedInstrMap; // to store instrns added in this phase
Chris Lattner9fcaf322002-01-31 00:41:13 +000084 cfg::LoopDepthCalculator LoopDepthCalc; // to calculate loop depths
Ruchira Sasankaf20079d2002-01-07 19:16:26 +000085 ReservedColorListType ResColList; // A set of reserved regs if desired.
86 // currently not used
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000087
Ruchira Sasankaca632ed2001-11-03 17:14:44 +000088
Ruchira Sasankaf20079d2002-01-07 19:16:26 +000089
90 //------- ------------------ private methods---------------------------------
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +000091
92 void addInterference(const Value *const Def, const LiveVarSet *const LVSet,
93 const bool isCallInst);
94
95 void addInterferencesForArgs();
96 void createIGNodeListsAndIGs();
97 void buildInterferenceGraphs();
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +000098
Ruchira Sasanka6275a042001-10-19 17:21:59 +000099 void setCallInterferences(const MachineInstr *MInst,
100 const LiveVarSet *const LVSetAft );
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000101
Ruchira Sasanka33b0d852001-10-23 21:38:42 +0000102 void move2DelayedInstr(const MachineInstr *OrigMI,
103 const MachineInstr *DelayedMI );
104
Ruchira Sasanka53516cd2001-10-19 21:42:06 +0000105 void markUnusableSugColors();
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000106 void allocateStackSpace4SpilledLRs();
107
Chris Lattner2b48b962001-11-08 20:55:05 +0000108 void insertCode4SpilledLR (const LiveRange *LR,
109 MachineInstr *MInst,
110 const BasicBlock *BB,
111 const unsigned OpNum);
Ruchira Sasanka53516cd2001-10-19 21:42:06 +0000112
Chris Lattner7f74a562002-01-20 22:54:45 +0000113 inline void constructLiveRanges() { LRI.constructLiveRanges(); }
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000114
115 void colorIncomingArgs();
Ruchira Sasanka560b0ad2001-09-30 23:19:57 +0000116 void colorCallRetArgs();
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000117 void updateMachineCode();
Ruchira Sasanka560b0ad2001-09-30 23:19:57 +0000118
Ruchira Sasanka86b2ad42001-09-15 19:08:41 +0000119 void printLabel(const Value *const Val);
120 void printMachineCode();
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000121
122 friend class UltraSparcRegInfo;
Ruchira Sasanka51fc1c22001-11-03 20:41:22 +0000123
124
Ruchira Sasankadec9bfd2001-11-15 20:22:37 +0000125 int getUsableUniRegAtMI(RegClass *RC, const int RegType,
126 const MachineInstr *MInst,
127 const LiveVarSet *LVSetBef, MachineInstr *MIBef,
128 MachineInstr *MIAft );
Ruchira Sasanka51fc1c22001-11-03 20:41:22 +0000129
Ruchira Sasankadec9bfd2001-11-15 20:22:37 +0000130 int getUnusedUniRegAtMI(RegClass *RC, const MachineInstr *MInst,
Ruchira Sasanka51fc1c22001-11-03 20:41:22 +0000131 const LiveVarSet *LVSetBef);
132
Ruchira Sasankadec9bfd2001-11-15 20:22:37 +0000133 void setRelRegsUsedByThisInst(RegClass *RC, const MachineInstr *MInst );
134 int getUniRegNotUsedByThisInst(RegClass *RC, const MachineInstr *MInst);
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000135
Ruchira Sasanka7765ca82001-11-14 15:37:13 +0000136 void addInterf4PseudoInstr(const MachineInstr *MInst);
Ruchira Sasanka51fc1c22001-11-03 20:41:22 +0000137
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000138 public:
Vikram S. Adved9f85982001-11-08 04:48:50 +0000139 PhyRegAlloc(Method *const M, const TargetMachine& TM,
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000140 MethodLiveVarInfo *const Lvi);
Ruchira Sasankaf20079d2002-01-07 19:16:26 +0000141 ~PhyRegAlloc();
142
143 // main method called for allocating registers
144 //
145 void allocateRegisters();
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000146
147};
148
149
Ruchira Sasankaf5788aa2001-09-08 14:22:50 +0000150#endif
151