blob: 38f8dd774b7f943017ec674c80490f81b4a7f53d [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();
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"
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000035#include "llvm/Analysis/LoopDepth.h"
Ruchira Sasanka21721b62001-10-15 16:22:44 +000036#include <deque>
Chris Lattner29f4c062002-02-03 07:13:04 +000037class MachineCodeForMethod;
Chris Lattner2182c782002-02-04 05:52:08 +000038class MachineRegInfo;
39class MethodLiveVarInfo;
40class MachineInstr;
Ruchira Sasanka20c82b12001-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 Sasanka7cd2ca12001-09-08 14:22:50 +000051class AddedInstrns
52{
53 public:
Chris Lattner697954c2002-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 Sasanka7cd2ca12001-09-08 14:22:50 +000056};
57
Chris Lattner697954c2002-01-20 22:54:45 +000058typedef std::hash_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
65// registers for a Method.
66//----------------------------------------------------------------------------
67
68
Vikram S. Adve12af1642001-11-08 04:48:50 +000069class PhyRegAlloc: public NonCopyable
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000070{
71
Chris Lattner697954c2002-01-20 22:54:45 +000072 std::vector<RegClass *> RegClassList; // vector of register classes
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000073 const TargetMachine &TM; // target machine
Vikram S. Adve12af1642001-11-08 04:48:50 +000074 const Method* Meth; // name of the method we work on
Chris Lattner29f4c062002-02-03 07:13:04 +000075 MachineCodeForMethod &mcInfo; // descriptor for method's native code
Ruchira Sasanka7cd2ca12001-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 Sasanka51bc0e72001-11-03 17:14:44 +000082
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000083 AddedInstrMapType AddedInstrMap; // to store instrns added in this phase
Chris Lattner92a12d52002-01-31 00:41:13 +000084 cfg::LoopDepthCalculator 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
Ruchira Sasanka51bc0e72001-11-03 17:14:44 +000088
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000089
90 //------- ------------------ private methods---------------------------------
Ruchira Sasanka7cd2ca12001-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 Sasankac4d4b762001-10-16 01:23:19 +000098
Ruchira Sasanka36f77072001-10-19 17:21:59 +000099 void setCallInterferences(const MachineInstr *MInst,
100 const LiveVarSet *const LVSetAft );
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000101
Ruchira Sasankaf7434f02001-10-23 21:38:42 +0000102 void move2DelayedInstr(const MachineInstr *OrigMI,
103 const MachineInstr *DelayedMI );
104
Ruchira Sasanka44d2b942001-10-19 21:42:06 +0000105 void markUnusableSugColors();
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000106 void allocateStackSpace4SpilledLRs();
107
Chris Lattner00d91c62001-11-08 20:55:05 +0000108 void insertCode4SpilledLR (const LiveRange *LR,
109 MachineInstr *MInst,
110 const BasicBlock *BB,
111 const unsigned OpNum);
Ruchira Sasanka44d2b942001-10-19 21:42:06 +0000112
Chris Lattner697954c2002-01-20 22:54:45 +0000113 inline void constructLiveRanges() { LRI.constructLiveRanges(); }
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000114
115 void colorIncomingArgs();
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000116 void colorCallRetArgs();
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000117 void updateMachineCode();
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000118
Ruchira Sasanka6053b932001-09-15 19:08:41 +0000119 void printLabel(const Value *const Val);
120 void printMachineCode();
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000121
122 friend class UltraSparcRegInfo;
Ruchira Sasanka80b1a1a2001-11-03 20:41:22 +0000123
124
Ruchira Sasanka825dd552001-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 Sasanka80b1a1a2001-11-03 20:41:22 +0000129
Ruchira Sasanka825dd552001-11-15 20:22:37 +0000130 int getUnusedUniRegAtMI(RegClass *RC, const MachineInstr *MInst,
Ruchira Sasanka80b1a1a2001-11-03 20:41:22 +0000131 const LiveVarSet *LVSetBef);
132
Ruchira Sasanka825dd552001-11-15 20:22:37 +0000133 void setRelRegsUsedByThisInst(RegClass *RC, const MachineInstr *MInst );
134 int getUniRegNotUsedByThisInst(RegClass *RC, const MachineInstr *MInst);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000135
Ruchira Sasankacbddf492001-11-14 15:37:13 +0000136 void addInterf4PseudoInstr(const MachineInstr *MInst);
Ruchira Sasanka80b1a1a2001-11-03 20:41:22 +0000137
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000138 public:
Vikram S. Adve12af1642001-11-08 04:48:50 +0000139 PhyRegAlloc(Method *const M, const TargetMachine& TM,
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000140 MethodLiveVarInfo *const Lvi);
Ruchira Sasanka42bd1772002-01-07 19:16:26 +0000141 ~PhyRegAlloc();
142
143 // main method called for allocating registers
144 //
145 void allocateRegisters();
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000146
147};
148
149
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000150#endif
151