blob: 4976c9bf9a1d03747cafa5bedd277fe545ff14b3 [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 Sasanka21721b62001-10-15 16:22:44 +000035#include <deque>
Chris Lattner29f4c062002-02-03 07:13:04 +000036class MachineCodeForMethod;
Chris Lattner2182c782002-02-04 05:52:08 +000037class MachineRegInfo;
38class MethodLiveVarInfo;
39class MachineInstr;
Chris Lattner14ab1ce2002-02-04 17:48:00 +000040namespace cfg { class LoopInfo; }
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
Chris Lattner0b0ffa02002-04-09 05:13:04 +000051struct AddedInstrns {
Chris Lattner697954c2002-01-20 22:54:45 +000052 std::deque<MachineInstr*> InstrnsBefore;// Added insts BEFORE an existing inst
53 std::deque<MachineInstr*> InstrnsAfter; // Added insts AFTER an existing inst
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000054};
55
Chris Lattner0b0ffa02002-04-09 05:13:04 +000056typedef std::map<const MachineInstr *, AddedInstrns> AddedInstrMapType;
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000057
58
59
Ruchira Sasanka20c82b12001-10-28 18:15:12 +000060//----------------------------------------------------------------------------
Ruchira Sasanka20c82b12001-10-28 18:15:12 +000061// class PhyRegAlloc:
62// Main class the register allocator. Call allocateRegisters() to allocate
Chris Lattnerb7653df2002-04-08 22:03:57 +000063// registers for a Function.
Ruchira Sasanka20c82b12001-10-28 18:15:12 +000064//----------------------------------------------------------------------------
65
66
Chris Lattner3e0f8282002-02-04 17:38:48 +000067class PhyRegAlloc: public NonCopyable {
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000068
Chris Lattner697954c2002-01-20 22:54:45 +000069 std::vector<RegClass *> RegClassList; // vector of register classes
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000070 const TargetMachine &TM; // target machine
Chris Lattnerb7653df2002-04-08 22:03:57 +000071 const Function *Meth; // name of the function we work on
Chris Lattner29f4c062002-02-03 07:13:04 +000072 MachineCodeForMethod &mcInfo; // descriptor for method's native code
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000073 MethodLiveVarInfo *const LVI; // LV information for this method
74 // (already computed for BBs)
75 LiveRangeInfo LRI; // LR info (will be computed)
76 const MachineRegInfo &MRI; // Machine Register information
77 const unsigned NumOfRegClasses; // recorded here for efficiency
78
Ruchira Sasanka51bc0e72001-11-03 17:14:44 +000079
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000080 AddedInstrMapType AddedInstrMap; // to store instrns added in this phase
Chris Lattner14ab1ce2002-02-04 17:48:00 +000081 cfg::LoopInfo *LoopDepthCalc; // to calculate loop depths
Ruchira Sasanka42bd1772002-01-07 19:16:26 +000082 ReservedColorListType ResColList; // A set of reserved regs if desired.
83 // currently not used
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +000084
Chris Lattner3e0f8282002-02-04 17:38:48 +000085public:
Chris Lattnerb7653df2002-04-08 22:03:57 +000086 PhyRegAlloc(Function *F, const TargetMachine& TM, MethodLiveVarInfo *Lvi,
Chris Lattner14ab1ce2002-02-04 17:48:00 +000087 cfg::LoopInfo *LoopDepthCalc);
Chris Lattner3e0f8282002-02-04 17:38:48 +000088 ~PhyRegAlloc();
89
90 // main method called for allocating registers
91 //
92 void allocateRegisters();
Vikram S. Adve705f95e2002-03-18 03:26:48 +000093
94
95 // access to register classes by class ID
96 //
97 const RegClass* getRegClassByID(unsigned int id) const {
98 return RegClassList[id];
99 }
100 RegClass* getRegClassByID(unsigned int id) {
101 return RegClassList[id]; }
102
103
Chris Lattner3e0f8282002-02-04 17:38:48 +0000104private:
105
Ruchira Sasanka51bc0e72001-11-03 17:14:44 +0000106
Ruchira Sasanka42bd1772002-01-07 19:16:26 +0000107
108 //------- ------------------ private methods---------------------------------
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000109
Chris Lattner5e5dfa32002-02-05 02:51:01 +0000110 void addInterference(const Value *Def, const ValueSet *LVSet,
111 bool isCallInst);
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000112
113 void addInterferencesForArgs();
114 void createIGNodeListsAndIGs();
115 void buildInterferenceGraphs();
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000116
Ruchira Sasanka36f77072001-10-19 17:21:59 +0000117 void setCallInterferences(const MachineInstr *MInst,
Chris Lattner5e5dfa32002-02-05 02:51:01 +0000118 const ValueSet *LVSetAft );
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000119
Ruchira Sasankaf7434f02001-10-23 21:38:42 +0000120 void move2DelayedInstr(const MachineInstr *OrigMI,
121 const MachineInstr *DelayedMI );
122
Ruchira Sasanka44d2b942001-10-19 21:42:06 +0000123 void markUnusableSugColors();
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000124 void allocateStackSpace4SpilledLRs();
125
Chris Lattner00d91c62001-11-08 20:55:05 +0000126 void insertCode4SpilledLR (const LiveRange *LR,
127 MachineInstr *MInst,
128 const BasicBlock *BB,
129 const unsigned OpNum);
Ruchira Sasanka44d2b942001-10-19 21:42:06 +0000130
Chris Lattner697954c2002-01-20 22:54:45 +0000131 inline void constructLiveRanges() { LRI.constructLiveRanges(); }
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000132
133 void colorIncomingArgs();
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000134 void colorCallRetArgs();
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000135 void updateMachineCode();
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000136
Ruchira Sasanka6053b932001-09-15 19:08:41 +0000137 void printLabel(const Value *const Val);
138 void printMachineCode();
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000139
140 friend class UltraSparcRegInfo;
Ruchira Sasanka80b1a1a2001-11-03 20:41:22 +0000141
142
Chris Lattner5e5dfa32002-02-05 02:51:01 +0000143 int getUsableUniRegAtMI(RegClass *RC, int RegType,
Ruchira Sasanka825dd552001-11-15 20:22:37 +0000144 const MachineInstr *MInst,
Vikram S. Adve705f95e2002-03-18 03:26:48 +0000145 const ValueSet *LVSetBef, MachineInstr *&MIBef,
146 MachineInstr *&MIAft );
Ruchira Sasanka80b1a1a2001-11-03 20:41:22 +0000147
Ruchira Sasanka825dd552001-11-15 20:22:37 +0000148 int getUnusedUniRegAtMI(RegClass *RC, const MachineInstr *MInst,
Chris Lattner5e5dfa32002-02-05 02:51:01 +0000149 const ValueSet *LVSetBef);
Ruchira Sasanka80b1a1a2001-11-03 20:41:22 +0000150
Ruchira Sasanka825dd552001-11-15 20:22:37 +0000151 void setRelRegsUsedByThisInst(RegClass *RC, const MachineInstr *MInst );
152 int getUniRegNotUsedByThisInst(RegClass *RC, const MachineInstr *MInst);
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000153
Ruchira Sasankacbddf492001-11-14 15:37:13 +0000154 void addInterf4PseudoInstr(const MachineInstr *MInst);
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000155};
156
157
Ruchira Sasanka7cd2ca12001-09-08 14:22:50 +0000158#endif
159