blob: 12f0bf05ebf00c23265ed9fdfd070e249b78958b [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
Chris Lattner483e14e2002-04-27 07:27:19 +000020 FunctionLiveVarInfo LVI(*FunctionI ); // compute LV info
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000021 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
Chris Lattner483e14e2002-04-27 07:27:19 +000026 PhyRegAlloc PRA(*FunctionI, target, &LVI); // allocate regs
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000027 PRA.allocateRegisters();
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000028*/
29
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000030#ifndef PHY_REG_ALLOC_H
31#define PHY_REG_ALLOC_H
32
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000033#include "llvm/CodeGen/RegClass.h"
34#include "llvm/CodeGen/LiveRangeInfo.h"
Vikram S. Adve0243ff92002-05-19 15:41:33 +000035#include <vector>
Chris Lattner97453d62002-04-28 20:40:16 +000036#include <map>
37
Misha Brukmanfce11432002-10-28 00:28:31 +000038class MachineFunction;
Chris Lattner2182c782002-02-04 05:52:08 +000039class MachineRegInfo;
Chris Lattner483e14e2002-04-27 07:27:19 +000040class FunctionLiveVarInfo;
Chris Lattner2182c782002-02-04 05:52:08 +000041class MachineInstr;
Chris Lattner8fc2f202002-04-28 16:19:42 +000042class LoopInfo;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +000043
44//----------------------------------------------------------------------------
45// Class AddedInstrns:
46// When register allocator inserts new instructions in to the existing
47// instruction stream, it does NOT directly modify the instruction stream.
48// Rather, it creates an object of AddedInstrns and stick it in the
49// AddedInstrMap for an existing instruction. This class contains two vectors
50// to store such instructions added before and after an existing instruction.
51//----------------------------------------------------------------------------
52
Chris Lattner0b0ffa02002-04-09 05:13:04 +000053struct AddedInstrns {
Chris Lattnerccdf23e2002-10-28 19:43:23 +000054 std::vector<MachineInstr*> InstrnsBefore;//Insts added BEFORE an existing inst
55 std::vector<MachineInstr*> InstrnsAfter; //Insts added AFTER an existing inst
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000056};
57
Chris Lattner0b0ffa02002-04-09 05:13:04 +000058typedef std::map<const MachineInstr *, AddedInstrns> AddedInstrMapType;
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000059
60
61
Ruchira Sasanka20c82b12001-10-28 18:15:12 +000062//----------------------------------------------------------------------------
Ruchira Sasanka20c82b12001-10-28 18:15:12 +000063// class PhyRegAlloc:
64// Main class the register allocator. Call allocateRegisters() to allocate
Chris Lattnerb7653df2002-04-08 22:03:57 +000065// registers for a Function.
Ruchira Sasanka20c82b12001-10-28 18:15:12 +000066//----------------------------------------------------------------------------
67
68
Chris Lattner3e0f8282002-02-04 17:38:48 +000069class PhyRegAlloc: public NonCopyable {
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000070
Chris Lattner697954c2002-01-20 22:54:45 +000071 std::vector<RegClass *> RegClassList; // vector of register classes
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000072 const TargetMachine &TM; // target machine
Chris Lattnerccdf23e2002-10-28 19:43:23 +000073 const Function *Fn; // name of the function we work on
74 MachineFunction &MF; // descriptor for method's native code
Chris Lattner8fc2f202002-04-28 16:19:42 +000075 FunctionLiveVarInfo *const LVI; // LV information for this method
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000076 // (already computed for BBs)
77 LiveRangeInfo LRI; // LR info (will be computed)
78 const MachineRegInfo &MRI; // Machine Register information
79 const unsigned NumOfRegClasses; // recorded here for efficiency
80
Ruchira Sasanka51bc0e72001-11-03 17:14:44 +000081
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000082 AddedInstrMapType AddedInstrMap; // to store instrns added in this phase
Vikram S. Adved23a2292002-04-25 04:46:28 +000083 AddedInstrns AddedInstrAtEntry; // to store instrns added at entry
Chris Lattner8fc2f202002-04-28 16:19:42 +000084 LoopInfo *LoopDepthCalc; // to calculate loop depths
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000085 ReservedColorListType ResColList; // A set of reserved regs if desired.
86 // currently not used
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000087
Chris Lattner3e0f8282002-02-04 17:38:48 +000088public:
Chris Lattner483e14e2002-04-27 07:27:19 +000089 PhyRegAlloc(Function *F, const TargetMachine& TM, FunctionLiveVarInfo *Lvi,
Chris Lattner8fc2f202002-04-28 16:19:42 +000090 LoopInfo *LoopDepthCalc);
Chris Lattner3e0f8282002-02-04 17:38:48 +000091 ~PhyRegAlloc();
92
93 // main method called for allocating registers
94 //
95 void allocateRegisters();
Vikram S. Adve705f95e2002-03-18 03:26:48 +000096
97
98 // access to register classes by class ID
99 //
100 const RegClass* getRegClassByID(unsigned int id) const {
101 return RegClassList[id];
102 }
103 RegClass* getRegClassByID(unsigned int id) {
104 return RegClassList[id]; }
105
106
Chris Lattner3e0f8282002-02-04 17:38:48 +0000107private:
108
Ruchira Sasanka51bc0e72001-11-03 17:14:44 +0000109
Ruchira Sasanka42bd1772002-01-07 19:16:26 +0000110
111 //------- ------------------ private methods---------------------------------
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000112
Chris Lattner5e5dfa32002-02-05 02:51:01 +0000113 void addInterference(const Value *Def, const ValueSet *LVSet,
114 bool isCallInst);
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000115
116 void addInterferencesForArgs();
117 void createIGNodeListsAndIGs();
118 void buildInterferenceGraphs();
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000119
Ruchira Sasanka36f77072001-10-19 17:21:59 +0000120 void setCallInterferences(const MachineInstr *MInst,
Chris Lattner5e5dfa32002-02-05 02:51:01 +0000121 const ValueSet *LVSetAft );
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000122
Ruchira Sasankaf7434f02001-10-23 21:38:42 +0000123 void move2DelayedInstr(const MachineInstr *OrigMI,
124 const MachineInstr *DelayedMI );
125
Ruchira Sasanka44d2b942001-10-19 21:42:06 +0000126 void markUnusableSugColors();
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000127 void allocateStackSpace4SpilledLRs();
128
Chris Lattner00d91c62001-11-08 20:55:05 +0000129 void insertCode4SpilledLR (const LiveRange *LR,
130 MachineInstr *MInst,
131 const BasicBlock *BB,
132 const unsigned OpNum);
Ruchira Sasanka44d2b942001-10-19 21:42:06 +0000133
Chris Lattner697954c2002-01-20 22:54:45 +0000134 inline void constructLiveRanges() { LRI.constructLiveRanges(); }
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000135
136 void colorIncomingArgs();
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000137 void colorCallRetArgs();
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000138 void updateMachineCode();
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000139
Ruchira Sasanka6053b932001-09-15 19:08:41 +0000140 void printLabel(const Value *const Val);
141 void printMachineCode();
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000142
143 friend class UltraSparcRegInfo;
Ruchira Sasanka80b1a1a2001-11-03 20:41:22 +0000144
145
Vikram S. Advec2580dd2002-07-08 22:39:36 +0000146 int getUsableUniRegAtMI(int RegType,
147 const ValueSet *LVSetBef,
148 MachineInstr *MInst,
149 std::vector<MachineInstr*>& MIBef,
150 std::vector<MachineInstr*>& MIAft);
151
Ruchira Sasanka825dd552001-11-15 20:22:37 +0000152 int getUnusedUniRegAtMI(RegClass *RC, const MachineInstr *MInst,
Vikram S. Advec2580dd2002-07-08 22:39:36 +0000153 const ValueSet *LVSetBef);
Ruchira Sasanka80b1a1a2001-11-03 20:41:22 +0000154
Ruchira Sasanka825dd552001-11-15 20:22:37 +0000155 void setRelRegsUsedByThisInst(RegClass *RC, const MachineInstr *MInst );
156 int getUniRegNotUsedByThisInst(RegClass *RC, const MachineInstr *MInst);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000157
Ruchira Sasankacbddf492001-11-14 15:37:13 +0000158 void addInterf4PseudoInstr(const MachineInstr *MInst);
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000159};
160
161
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000162#endif
163