blob: 4d009cfcbea71bbaff895aaef8a584214f098b44 [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 Sasanka21721b62001-10-15 16:22:44 +000041#include <deque>
Chris Lattner29f4c062002-02-03 07:13:04 +000042class MachineCodeForMethod;
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
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000053class AddedInstrns
54{
55 public:
Chris Lattner697954c2002-01-20 22:54:45 +000056 std::deque<MachineInstr*> InstrnsBefore;// Added insts BEFORE an existing inst
57 std::deque<MachineInstr*> InstrnsAfter; // Added insts AFTER an existing inst
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000058};
59
Chris Lattner697954c2002-01-20 22:54:45 +000060typedef std::hash_map<const MachineInstr *, AddedInstrns *> AddedInstrMapType;
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000061
62
63
Ruchira Sasanka20c82b12001-10-28 18:15:12 +000064//----------------------------------------------------------------------------
Ruchira Sasanka20c82b12001-10-28 18:15:12 +000065// class PhyRegAlloc:
66// Main class the register allocator. Call allocateRegisters() to allocate
67// registers for a Method.
68//----------------------------------------------------------------------------
69
70
Vikram S. Adve12af1642001-11-08 04:48:50 +000071class PhyRegAlloc: public NonCopyable
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000072{
73
Chris Lattner697954c2002-01-20 22:54:45 +000074 std::vector<RegClass *> RegClassList; // vector of register classes
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000075 const TargetMachine &TM; // target machine
Vikram S. Adve12af1642001-11-08 04:48:50 +000076 const Method* Meth; // name of the method we work on
Chris Lattner29f4c062002-02-03 07:13:04 +000077 MachineCodeForMethod &mcInfo; // descriptor for method's native code
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000078 MethodLiveVarInfo *const LVI; // LV information for this method
79 // (already computed for BBs)
80 LiveRangeInfo LRI; // LR info (will be computed)
81 const MachineRegInfo &MRI; // Machine Register information
82 const unsigned NumOfRegClasses; // recorded here for efficiency
83
Ruchira Sasanka51bc0e72001-11-03 17:14:44 +000084
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000085 AddedInstrMapType AddedInstrMap; // to store instrns added in this phase
Chris Lattner92a12d52002-01-31 00:41:13 +000086 cfg::LoopDepthCalculator LoopDepthCalc; // to calculate loop depths
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000087 ReservedColorListType ResColList; // A set of reserved regs if desired.
88 // currently not used
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000089
Ruchira Sasanka51bc0e72001-11-03 17:14:44 +000090
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000091
92 //------- ------------------ private methods---------------------------------
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000093
94 void addInterference(const Value *const Def, const LiveVarSet *const LVSet,
95 const bool isCallInst);
96
97 void addInterferencesForArgs();
98 void createIGNodeListsAndIGs();
99 void buildInterferenceGraphs();
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000100
Ruchira Sasanka36f77072001-10-19 17:21:59 +0000101 void setCallInterferences(const MachineInstr *MInst,
102 const LiveVarSet *const LVSetAft );
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000103
Ruchira Sasankaf7434f02001-10-23 21:38:42 +0000104 void move2DelayedInstr(const MachineInstr *OrigMI,
105 const MachineInstr *DelayedMI );
106
Ruchira Sasanka44d2b942001-10-19 21:42:06 +0000107 void markUnusableSugColors();
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000108 void allocateStackSpace4SpilledLRs();
109
Chris Lattner00d91c62001-11-08 20:55:05 +0000110 void insertCode4SpilledLR (const LiveRange *LR,
111 MachineInstr *MInst,
112 const BasicBlock *BB,
113 const unsigned OpNum);
Ruchira Sasanka44d2b942001-10-19 21:42:06 +0000114
Chris Lattner697954c2002-01-20 22:54:45 +0000115 inline void constructLiveRanges() { LRI.constructLiveRanges(); }
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000116
117 void colorIncomingArgs();
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000118 void colorCallRetArgs();
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000119 void updateMachineCode();
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000120
Ruchira Sasanka6053b932001-09-15 19:08:41 +0000121 void printLabel(const Value *const Val);
122 void printMachineCode();
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000123
124 friend class UltraSparcRegInfo;
Ruchira Sasanka80b1a1a2001-11-03 20:41:22 +0000125
126
Ruchira Sasanka825dd552001-11-15 20:22:37 +0000127 int getUsableUniRegAtMI(RegClass *RC, const int RegType,
128 const MachineInstr *MInst,
129 const LiveVarSet *LVSetBef, MachineInstr *MIBef,
130 MachineInstr *MIAft );
Ruchira Sasanka80b1a1a2001-11-03 20:41:22 +0000131
Ruchira Sasanka825dd552001-11-15 20:22:37 +0000132 int getUnusedUniRegAtMI(RegClass *RC, const MachineInstr *MInst,
Ruchira Sasanka80b1a1a2001-11-03 20:41:22 +0000133 const LiveVarSet *LVSetBef);
134
Ruchira Sasanka825dd552001-11-15 20:22:37 +0000135 void setRelRegsUsedByThisInst(RegClass *RC, const MachineInstr *MInst );
136 int getUniRegNotUsedByThisInst(RegClass *RC, const MachineInstr *MInst);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000137
Ruchira Sasankacbddf492001-11-14 15:37:13 +0000138 void addInterf4PseudoInstr(const MachineInstr *MInst);
Ruchira Sasanka80b1a1a2001-11-03 20:41:22 +0000139
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000140 public:
Vikram S. Adve12af1642001-11-08 04:48:50 +0000141 PhyRegAlloc(Method *const M, const TargetMachine& TM,
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000142 MethodLiveVarInfo *const Lvi);
Ruchira Sasanka42bd1772002-01-07 19:16:26 +0000143 ~PhyRegAlloc();
144
145 // main method called for allocating registers
146 //
147 void allocateRegisters();
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000148
149};
150
151
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000152#endif
153