blob: 6871b2d28ada6c7b4fcc39afe0d32f83dad73b58 [file] [log] [blame]
Chris Lattner697954c2002-01-20 22:54:45 +00001/* Title: PhyRegAlloc.h -*- C++ -*-
Ruchira Sasanka7cd2ca12001-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 Sasanka42bd1772002-01-07 19:16:26 +00007 =====
Ruchira Sasanka7cd2ca12001-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 Sasanka42bd1772002-01-07 19:16:26 +000018 Register allocation must be done as:
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000019
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000020 MethodLiveVarInfo LVI(*MethodI ); // compute LV info
21 LVI.analyze();
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000022
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000023 TargetMachine &target = ....
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000024
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000025
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000026 PhyRegAlloc PRA(*MethodI, target, &LVI); // allocate regs
27 PRA.allocateRegisters();
28
29
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000030
31*/
32
Ruchira Sasanka7cd2ca12001-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 Sasanka7cd2ca12001-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 Sasanka42bd1772002-01-07 19:16:26 +000040#include "llvm/Analysis/LoopDepth.h"
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000041
Ruchira Sasanka21721b62001-10-15 16:22:44 +000042#include <deque>
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000043
Ruchira Sasanka20c82b12001-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 Sasanka7cd2ca12001-09-08 14:22:50 +000054class AddedInstrns
55{
56 public:
Chris Lattner697954c2002-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 Sasanka7cd2ca12001-09-08 14:22:50 +000059};
60
Chris Lattner697954c2002-01-20 22:54:45 +000061typedef std::hash_map<const MachineInstr *, AddedInstrns *> AddedInstrMapType;
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000062
63
64
Ruchira Sasanka20c82b12001-10-28 18:15:12 +000065//----------------------------------------------------------------------------
Ruchira Sasanka20c82b12001-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. Adve12af1642001-11-08 04:48:50 +000072class PhyRegAlloc: public NonCopyable
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000073{
74
Chris Lattner697954c2002-01-20 22:54:45 +000075 std::vector<RegClass *> RegClassList; // vector of register classes
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000076 const TargetMachine &TM; // target machine
Vikram S. Adve12af1642001-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 Sasanka7cd2ca12001-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 Sasanka51bc0e72001-11-03 17:14:44 +000085
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000086 AddedInstrMapType AddedInstrMap; // to store instrns added in this phase
Ruchira Sasanka42bd1772002-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 Sasanka7cd2ca12001-09-08 14:22:50 +000090
Ruchira Sasanka51bc0e72001-11-03 17:14:44 +000091
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000092
93 //------- ------------------ private methods---------------------------------
Ruchira Sasanka7cd2ca12001-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 Sasankac4d4b762001-10-16 01:23:19 +0000101
Ruchira Sasanka36f77072001-10-19 17:21:59 +0000102 void setCallInterferences(const MachineInstr *MInst,
103 const LiveVarSet *const LVSetAft );
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000104
Ruchira Sasankaf7434f02001-10-23 21:38:42 +0000105 void move2DelayedInstr(const MachineInstr *OrigMI,
106 const MachineInstr *DelayedMI );
107
Ruchira Sasanka44d2b942001-10-19 21:42:06 +0000108 void markUnusableSugColors();
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000109 void allocateStackSpace4SpilledLRs();
110
Chris Lattner00d91c62001-11-08 20:55:05 +0000111 void insertCode4SpilledLR (const LiveRange *LR,
112 MachineInstr *MInst,
113 const BasicBlock *BB,
114 const unsigned OpNum);
Ruchira Sasanka44d2b942001-10-19 21:42:06 +0000115
Chris Lattner697954c2002-01-20 22:54:45 +0000116 inline void constructLiveRanges() { LRI.constructLiveRanges(); }
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000117
118 void colorIncomingArgs();
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000119 void colorCallRetArgs();
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000120 void updateMachineCode();
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000121
Ruchira Sasanka6053b932001-09-15 19:08:41 +0000122 void printLabel(const Value *const Val);
123 void printMachineCode();
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000124
125 friend class UltraSparcRegInfo;
Ruchira Sasanka80b1a1a2001-11-03 20:41:22 +0000126
127
Ruchira Sasanka825dd552001-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 Sasanka80b1a1a2001-11-03 20:41:22 +0000132
Ruchira Sasanka825dd552001-11-15 20:22:37 +0000133 int getUnusedUniRegAtMI(RegClass *RC, const MachineInstr *MInst,
Ruchira Sasanka80b1a1a2001-11-03 20:41:22 +0000134 const LiveVarSet *LVSetBef);
135
Ruchira Sasanka825dd552001-11-15 20:22:37 +0000136 void setRelRegsUsedByThisInst(RegClass *RC, const MachineInstr *MInst );
137 int getUniRegNotUsedByThisInst(RegClass *RC, const MachineInstr *MInst);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000138
Ruchira Sasankacbddf492001-11-14 15:37:13 +0000139 void addInterf4PseudoInstr(const MachineInstr *MInst);
Ruchira Sasanka80b1a1a2001-11-03 20:41:22 +0000140
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000141 public:
Vikram S. Adve12af1642001-11-08 04:48:50 +0000142 PhyRegAlloc(Method *const M, const TargetMachine& TM,
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000143 MethodLiveVarInfo *const Lvi);
Ruchira Sasanka42bd1772002-01-07 19:16:26 +0000144 ~PhyRegAlloc();
145
146 // main method called for allocating registers
147 //
148 void allocateRegisters();
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000149
150};
151
152
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000153#endif
154