=====
* RegisterClasses: Each RegClass accepts a
- MachineRegClass which contains machine specific info about that register
+ TargetRegClass 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
+ access functions in the TargetRegClass object passed into it to get
machine specific info.
* Machine dependent work: All parts of the register coloring algorithm
#ifndef PHY_REG_ALLOC_H
#define PHY_REG_ALLOC_H
-#include "llvm/CodeGen/RegClass.h"
#include "llvm/CodeGen/LiveRangeInfo.h"
+#include "llvm/CodeGen/MachineBasicBlock.h"
#include <map>
class MachineFunction;
-class MachineRegInfo;
+class TargetRegInfo;
class FunctionLiveVarInfo;
class MachineInstr;
class LoopInfo;
+class RegClass;
//----------------------------------------------------------------------------
// Class AddedInstrns:
// registers for a Function.
//----------------------------------------------------------------------------
-class PhyRegAlloc: public NonCopyable {
+class PhyRegAlloc {
std::vector<RegClass *> RegClassList; // vector of register classes
const TargetMachine &TM; // target machine
const Function *Fn; // name of the function we work on
FunctionLiveVarInfo *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 TargetRegInfo &MRI; // Machine Register information
const unsigned NumOfRegClasses; // recorded here for efficiency
+ // Map to indicate whether operands of each MachineInstr have been updated
+ // according to their assigned colors. This is primarily for debugging and
+ // could be removed in the long run.
+ std::map<const MachineInstr *, bool> OperandsColoredMap;
// AddedInstrMap - Used to store instrns added in this phase
std::map<const MachineInstr *, AddedInstrns> AddedInstrMap;
+ // ScratchRegsUsed - Contains scratch register uses for a particular MI.
+ typedef std::multimap<const MachineInstr*, int> ScratchRegsUsedTy;
+ ScratchRegsUsedTy ScratchRegsUsed;
+
AddedInstrns AddedInstrAtEntry; // to store instrns added at entry
LoopInfo *LoopDepthCalc; // to calculate loop depths
- ReservedColorListType ResColList; // A set of reserved regs if desired.
- // currently not used
+ PhyRegAlloc(const PhyRegAlloc&); // DO NOT IMPLEMENT
+ void operator=(const PhyRegAlloc&); // DO NOT IMPLEMENT
public:
PhyRegAlloc(Function *F, const TargetMachine& TM, FunctionLiveVarInfo *Lvi,
LoopInfo *LoopDepthCalc);
//
void allocateRegisters();
-
// access to register classes by class ID
//
- const RegClass* getRegClassByID(unsigned int id) const {
- return RegClassList[id];
+ const RegClass* getRegClassByID(unsigned id) const {
+ return RegClassList[id];
}
- RegClass* getRegClassByID(unsigned int id) {
- return RegClassList[id]; }
-
-
+ RegClass* getRegClassByID(unsigned id) {
+ return RegClassList[id];
+ }
+
private:
void addInterference(const Value *Def, const ValueSet *LVSet,
bool isCallInst);
void createIGNodeListsAndIGs();
void buildInterferenceGraphs();
- void setCallInterferences(const MachineInstr *MInst,
- const ValueSet *LVSetAft );
+ void setCallInterferences(const MachineInstr *MI,
+ const ValueSet *LVSetAft);
void move2DelayedInstr(const MachineInstr *OrigMI,
- const MachineInstr *DelayedMI );
+ const MachineInstr *DelayedMI);
void markUnusableSugColors();
void allocateStackSpace4SpilledLRs();
- void insertCode4SpilledLR (const LiveRange *LR,
- MachineInstr *MInst,
- const BasicBlock *BB,
- const unsigned OpNum);
+ void insertCode4SpilledLR(const LiveRange *LR,
+ MachineBasicBlock::iterator& MII,
+ MachineBasicBlock &MBB, unsigned OpNum);
+
+ // Method for inserting caller saving code. The caller must save all the
+ // volatile registers live across a call.
+ void insertCallerSavingCode(std::vector<MachineInstr*>& instrnsBefore,
+ std::vector<MachineInstr*>& instrnsAfter,
+ MachineInstr *CallMI,
+ const BasicBlock *BB);
inline void constructLiveRanges() { LRI.constructLiveRanges(); }
void colorIncomingArgs();
void colorCallRetArgs();
void updateMachineCode();
+ void updateInstruction(MachineBasicBlock::iterator& MII,
+ MachineBasicBlock &MBB);
- void printLabel(const Value *const Val);
+ void printLabel(const Value *Val);
void printMachineCode();
- friend class UltraSparcRegInfo; // FIXME: remove this
-
- int getUsableUniRegAtMI(int RegType,
- const ValueSet *LVSetBef,
- MachineInstr *MInst,
+ int getUsableUniRegAtMI(int RegType, const ValueSet *LVSetBef,
+ MachineInstr *MI,
std::vector<MachineInstr*>& MIBef,
std::vector<MachineInstr*>& MIAft);
- int getUnusedUniRegAtMI(RegClass *RC, const MachineInstr *MInst,
- const ValueSet *LVSetBef);
+ // Callback method used to find unused registers.
+ // LVSetBef is the live variable set to search for an unused register.
+ // If it is not specified, the LV set before the current MI is used.
+ // This is sufficient as long as no new copy instructions are generated
+ // to copy the free register to memory.
+ //
+ int getUnusedUniRegAtMI(RegClass *RC, int RegType,
+ const MachineInstr *MI,
+ const ValueSet *LVSetBef = 0);
+
+ void setRelRegsUsedByThisInst(RegClass *RC, int RegType,
+ const MachineInstr *MI);
- void setRelRegsUsedByThisInst(RegClass *RC, const MachineInstr *MInst );
- int getUniRegNotUsedByThisInst(RegClass *RC, const MachineInstr *MInst);
+ int getUniRegNotUsedByThisInst(RegClass *RC, int RegType,
+ const MachineInstr *MI);
- void addInterf4PseudoInstr(const MachineInstr *MInst);
+ void addInterf4PseudoInstr(const MachineInstr *MI);
};