From 36f7707d2a06acfe4199a5533a60a9f50915ddf8 Mon Sep 17 00:00:00 2001 From: Ruchira Sasanka Date: Fri, 19 Oct 2001 17:21:59 +0000 Subject: [PATCH] Changed Call interference info git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@917 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/RegAlloc/IGNode.h | 4 +-- lib/CodeGen/RegAlloc/LiveRange.h | 31 +++++++++++++++++------ lib/CodeGen/RegAlloc/PhyRegAlloc.h | 2 ++ lib/Target/SparcV9/RegAlloc/IGNode.h | 4 +-- lib/Target/SparcV9/RegAlloc/LiveRange.h | 31 +++++++++++++++++------ lib/Target/SparcV9/RegAlloc/PhyRegAlloc.h | 2 ++ 6 files changed, 54 insertions(+), 20 deletions(-) diff --git a/lib/CodeGen/RegAlloc/IGNode.h b/lib/CodeGen/RegAlloc/IGNode.h index 2f437f9a574..bcaf439b7f5 100644 --- a/lib/CodeGen/RegAlloc/IGNode.h +++ b/lib/CodeGen/RegAlloc/IGNode.h @@ -122,8 +122,8 @@ class IGNode // { ParentLR->markForLoadFromStack(); } - inline unsigned int getNumOfCallInterferences() const - { return ParentLR->getNumOfCallInterferences(); } + inline unsigned int isCallInterference() const + { return ParentLR->isCallInterference(); } inline LiveRange *getParentLR() const { return ParentLR; } diff --git a/lib/CodeGen/RegAlloc/LiveRange.h b/lib/CodeGen/RegAlloc/LiveRange.h index 28e07122839..c0548d7fb9d 100644 --- a/lib/CodeGen/RegAlloc/LiveRange.h +++ b/lib/CodeGen/RegAlloc/LiveRange.h @@ -28,13 +28,20 @@ class LiveRange : public ValueSet RegClass *MyRegClass; // register classs (e.g., int, FP) for this LR // a list of call instructions that interferes with this live range - vector CallInterferenceList; + //vector CallInterferenceList; + + // does this live range span across calls? + // This information is used by graph + // coloring algo to avoid allocating volatile colors to live ranges + // that span across calls (since they have to be saved/restored) + + bool doesSpanAcrossCalls; IGNode *UserIGNode; // IGNode which uses this LR int Color; // color assigned to this live range bool mustSpill; // whether this LR must be spilt - // whether this LR must be saved accross calls + // whether this LR must be saved accross calls ***TODO REMOVE this bool mustSaveAcrossCalls; // bool mustLoadFromStack; // must load from stack at start of method @@ -55,7 +62,7 @@ class LiveRange : public ValueSet inline bool hasColor() const { return Color != -1; } - + inline unsigned int getColor() const { assert( Color != -1); return (unsigned) Color ; } @@ -63,16 +70,22 @@ class LiveRange : public ValueSet { Color = (int) Col ; } - inline void addCallInterference(const Instruction *const Inst) - { CallInterferenceList.push_back( Inst ); } + inline void setCallInterference() + { doesSpanAcrossCalls = 1; + //CallInterferenceList.push_back( Inst ); + } + + + /* inline const Instruction *const getCallInterference(const unsigned i) const { assert( i < CallInterferenceList.size() ); return CallInterferenceList[i]; } + */ - inline unsigned int getNumOfCallInterferences() const - { return CallInterferenceList.size(); } + inline bool isCallInterference() const + { return (doesSpanAcrossCalls == 1); } inline void markForSpill() { mustSpill = true; } @@ -113,12 +126,14 @@ class LiveRange : public ValueSet return ( SuggestedColor > -1); } - inline LiveRange() : ValueSet() , CallInterferenceList() + inline LiveRange() : ValueSet() /* , CallInterferenceList() */ { Color = SuggestedColor = -1; // not yet colored mustSpill = mustSaveAcrossCalls = false; MyRegClass = NULL; UserIGNode = NULL; + doesSpanAcrossCalls = false; + } }; diff --git a/lib/CodeGen/RegAlloc/PhyRegAlloc.h b/lib/CodeGen/RegAlloc/PhyRegAlloc.h index 243b3fa3c2f..bd41c8882c3 100644 --- a/lib/CodeGen/RegAlloc/PhyRegAlloc.h +++ b/lib/CodeGen/RegAlloc/PhyRegAlloc.h @@ -84,6 +84,8 @@ class PhyRegAlloc void insertCallerSavingCode(const MachineInstr *MInst, const BasicBlock *BB ); + void setCallInterferences(const MachineInstr *MInst, + const LiveVarSet *const LVSetAft ); inline void constructLiveRanges() { LRI.constructLiveRanges(); } diff --git a/lib/Target/SparcV9/RegAlloc/IGNode.h b/lib/Target/SparcV9/RegAlloc/IGNode.h index 2f437f9a574..bcaf439b7f5 100644 --- a/lib/Target/SparcV9/RegAlloc/IGNode.h +++ b/lib/Target/SparcV9/RegAlloc/IGNode.h @@ -122,8 +122,8 @@ class IGNode // { ParentLR->markForLoadFromStack(); } - inline unsigned int getNumOfCallInterferences() const - { return ParentLR->getNumOfCallInterferences(); } + inline unsigned int isCallInterference() const + { return ParentLR->isCallInterference(); } inline LiveRange *getParentLR() const { return ParentLR; } diff --git a/lib/Target/SparcV9/RegAlloc/LiveRange.h b/lib/Target/SparcV9/RegAlloc/LiveRange.h index 28e07122839..c0548d7fb9d 100644 --- a/lib/Target/SparcV9/RegAlloc/LiveRange.h +++ b/lib/Target/SparcV9/RegAlloc/LiveRange.h @@ -28,13 +28,20 @@ class LiveRange : public ValueSet RegClass *MyRegClass; // register classs (e.g., int, FP) for this LR // a list of call instructions that interferes with this live range - vector CallInterferenceList; + //vector CallInterferenceList; + + // does this live range span across calls? + // This information is used by graph + // coloring algo to avoid allocating volatile colors to live ranges + // that span across calls (since they have to be saved/restored) + + bool doesSpanAcrossCalls; IGNode *UserIGNode; // IGNode which uses this LR int Color; // color assigned to this live range bool mustSpill; // whether this LR must be spilt - // whether this LR must be saved accross calls + // whether this LR must be saved accross calls ***TODO REMOVE this bool mustSaveAcrossCalls; // bool mustLoadFromStack; // must load from stack at start of method @@ -55,7 +62,7 @@ class LiveRange : public ValueSet inline bool hasColor() const { return Color != -1; } - + inline unsigned int getColor() const { assert( Color != -1); return (unsigned) Color ; } @@ -63,16 +70,22 @@ class LiveRange : public ValueSet { Color = (int) Col ; } - inline void addCallInterference(const Instruction *const Inst) - { CallInterferenceList.push_back( Inst ); } + inline void setCallInterference() + { doesSpanAcrossCalls = 1; + //CallInterferenceList.push_back( Inst ); + } + + + /* inline const Instruction *const getCallInterference(const unsigned i) const { assert( i < CallInterferenceList.size() ); return CallInterferenceList[i]; } + */ - inline unsigned int getNumOfCallInterferences() const - { return CallInterferenceList.size(); } + inline bool isCallInterference() const + { return (doesSpanAcrossCalls == 1); } inline void markForSpill() { mustSpill = true; } @@ -113,12 +126,14 @@ class LiveRange : public ValueSet return ( SuggestedColor > -1); } - inline LiveRange() : ValueSet() , CallInterferenceList() + inline LiveRange() : ValueSet() /* , CallInterferenceList() */ { Color = SuggestedColor = -1; // not yet colored mustSpill = mustSaveAcrossCalls = false; MyRegClass = NULL; UserIGNode = NULL; + doesSpanAcrossCalls = false; + } }; diff --git a/lib/Target/SparcV9/RegAlloc/PhyRegAlloc.h b/lib/Target/SparcV9/RegAlloc/PhyRegAlloc.h index 243b3fa3c2f..bd41c8882c3 100644 --- a/lib/Target/SparcV9/RegAlloc/PhyRegAlloc.h +++ b/lib/Target/SparcV9/RegAlloc/PhyRegAlloc.h @@ -84,6 +84,8 @@ class PhyRegAlloc void insertCallerSavingCode(const MachineInstr *MInst, const BasicBlock *BB ); + void setCallInterferences(const MachineInstr *MInst, + const LiveVarSet *const LVSetAft ); inline void constructLiveRanges() { LRI.constructLiveRanges(); } -- 2.34.1