1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-28 14:32:51 +01:00
llvm-mirror/lib/CodeGen/RegAlloc/PhyRegAlloc.h
Chris Lattner 3e2a85a0e3 This checkin represents some cleanup of the backend, implementing the following things:
1. The TargetMachine structure is free to decide the process a particular target uses to generate code.
2. All of the gooee details of the sparc backend are now localized in the lib/CodeGen/TargetMAchine/Sparc directory.  The Sparc.h file that is globally visible is just a stub.
3. The Sparc.h file that esxists now will dissapear entirely someday when we have multiple backends chosen by a factory of some sort.

llvm-svn: 559
2001-09-14 03:37:52 +00:00

105 lines
2.8 KiB
C++

/* Title: PhyRegAlloc.h
Author: Ruchira Sasanka
Date: Aug 20, 01
Purpose: This is the main entry point for register allocation.
Notes:
* RegisterClasses: Each RegClass accepts a
MachineRegClass which contains machine specific info about that register
class. The code in the RegClass is machine independent and they use
access functions in the MachineRegClass object passed into it to get
machine specific info.
* Machine dependent work: All parts of the register coloring algorithm
except coloring of an individual node are machine independent.
Register allocation must be done as:
static const MachineRegInfo MRI = MachineRegInfo(); // machine reg info
MethodLiveVarInfo LVI(*MethodI ); // compute LV info
LVI.analyze();
PhyRegAlloc PRA(*MethodI, &MRI, &LVI); // allocate regs
PRA.allocateRegisters();
Assumptions:
All values in a live range will be of the same physical reg class.
*/
#ifndef PHY_REG_ALLOC_H
#define PHY_REG_ALLOC_H
#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/CodeGen/RegClass.h"
#include "llvm/CodeGen/LiveRangeInfo.h"
#include "llvm/Analysis/LiveVar/MethodLiveVarInfo.h"
class AddedInstrns
{
public:
vector<const MachineInstr *> InstrnsBefore;
vector<const MachineInstr *> InstrnsAfter;
AddedInstrns() : InstrnsBefore(), InstrnsAfter() { }
};
typedef hash_map<const MachineInstr *, AddedInstrns *> AddedInstrMapType;
class PhyRegAlloc
{
vector<RegClass *> RegClassList ; // vector of register classes
const Method *const Meth; // name of the method we work on
const TargetMachine &TM; // target machine
MethodLiveVarInfo *const LVI; // LV information for this method
// (already computed for BBs)
LiveRangeInfo LRI; // LR info (will be computed)
const MachineRegInfo &MRI; // Machine Register information
const unsigned NumOfRegClasses; // recorded here for efficiency
vector<const Instruction *> CallInstrList; // a list of all call instrs
AddedInstrMapType AddedInstrMap; // to store instrns added in this phase
//------- private methods ---------------------------------------------------
void addInterference(const Value *const Def, const LiveVarSet *const LVSet,
const bool isCallInst);
void addInterferencesForArgs();
void createIGNodeListsAndIGs();
void buildInterferenceGraphs();
inline void constructLiveRanges()
{ LRI.constructLiveRanges(); }
void colorIncomingArgs();
void updateMachineCode();
public:
PhyRegAlloc(const Method *const M, const TargetMachine& TM,
MethodLiveVarInfo *const Lvi);
void allocateRegisters(); // main method called for allocatin
};
#endif