aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2009-07-09 03:57:02 +0000
committerLang Hames <lhames@gmail.com>2009-07-09 03:57:02 +0000
commitffd1326ff8dfc652a8026c3faebf55bbba7c32c7 (patch)
treea55447fb0b489320a44a07f28e10683915cecf61 /include
parent482fa0f2bcfca5274b14c808526c8ae4fe97007d (diff)
downloadexternal_llvm-ffd1326ff8dfc652a8026c3faebf55bbba7c32c7.zip
external_llvm-ffd1326ff8dfc652a8026c3faebf55bbba7c32c7.tar.gz
external_llvm-ffd1326ff8dfc652a8026c3faebf55bbba7c32c7.tar.bz2
Improved tracking of value number kills. VN kills are now represented
as an (index,bool) pair. The bool flag records whether the kill is a PHI kill or not. This code will be used to enable splitting of live intervals containing PHI-kills. A slight change to live interval weights introduced an extra spill into lsr-code-insertion (outside the critical sections). The test condition has been updated to reflect this. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75097 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r--include/llvm/CodeGen/LiveInterval.h82
-rw-r--r--include/llvm/CodeGen/LiveIntervalAnalysis.h2
2 files changed, 61 insertions, 23 deletions
diff --git a/include/llvm/CodeGen/LiveInterval.h b/include/llvm/CodeGen/LiveInterval.h
index 0cb7e90..6977bae 100644
--- a/include/llvm/CodeGen/LiveInterval.h
+++ b/include/llvm/CodeGen/LiveInterval.h
@@ -62,13 +62,28 @@ namespace llvm {
unsigned char flags;
public:
+ /// Holds information about individual kills.
+ struct KillInfo {
+ bool isPHIKill : 1;
+ unsigned killIdx : 31;
+
+ KillInfo(bool isPHIKill, unsigned killIdx)
+ : isPHIKill(isPHIKill), killIdx(killIdx) {
+
+ assert(killIdx != 0 && "Zero kill indices are no longer permitted.");
+ }
+
+ };
+
+ typedef SmallVector<KillInfo, 4> KillSet;
+
/// The ID number of this value.
unsigned id;
/// The index of the defining instruction (if isDefAccurate() returns true).
unsigned def;
MachineInstr *copy;
- SmallVector<unsigned, 4> kills;
+ KillSet kills;
VNInfo()
: flags(IS_UNUSED), id(~1U), def(0), copy(0) {}
@@ -137,6 +152,18 @@ namespace llvm {
};
+ inline bool operator<(const VNInfo::KillInfo &k1, const VNInfo::KillInfo &k2) {
+ return k1.killIdx < k2.killIdx;
+ }
+
+ inline bool operator<(const VNInfo::KillInfo &k, unsigned idx) {
+ return k.killIdx < idx;
+ }
+
+ inline bool operator<(unsigned idx, const VNInfo::KillInfo &k) {
+ return idx < k.killIdx;
+ }
+
/// LiveRange structure - This represents a simple register range in the
/// program, with an inclusive start point and an exclusive end point.
/// These ranges are rendered as [start,end).
@@ -339,27 +366,28 @@ namespace llvm {
/// addKill - Add a kill instruction index to the specified value
/// number.
- static void addKill(VNInfo *VNI, unsigned KillIdx) {
- SmallVector<unsigned, 4> &kills = VNI->kills;
+ static void addKill(VNInfo *VNI, unsigned KillIdx, bool phiKill) {
+ VNInfo::KillSet &kills = VNI->kills;
+ VNInfo::KillInfo newKill(phiKill, KillIdx);
if (kills.empty()) {
- kills.push_back(KillIdx);
+ kills.push_back(newKill);
} else {
- SmallVector<unsigned, 4>::iterator
- I = std::lower_bound(kills.begin(), kills.end(), KillIdx);
- kills.insert(I, KillIdx);
+ VNInfo::KillSet::iterator
+ I = std::lower_bound(kills.begin(), kills.end(), newKill);
+ kills.insert(I, newKill);
}
}
/// addKills - Add a number of kills into the VNInfo kill vector. If this
/// interval is live at a kill point, then the kill is not added.
- void addKills(VNInfo *VNI, const SmallVector<unsigned, 4> &kills) {
+ void addKills(VNInfo *VNI, const VNInfo::KillSet &kills) {
for (unsigned i = 0, e = static_cast<unsigned>(kills.size());
i != e; ++i) {
- unsigned KillIdx = kills[i];
- if (!liveBeforeAndAt(KillIdx)) {
- SmallVector<unsigned, 4>::iterator
- I = std::lower_bound(VNI->kills.begin(), VNI->kills.end(), KillIdx);
- VNI->kills.insert(I, KillIdx);
+ const VNInfo::KillInfo &Kill = kills[i];
+ if (!liveBeforeAndAt(Kill.killIdx)) {
+ VNInfo::KillSet::iterator
+ I = std::lower_bound(VNI->kills.begin(), VNI->kills.end(), Kill);
+ VNI->kills.insert(I, Kill);
}
}
}
@@ -367,10 +395,10 @@ namespace llvm {
/// removeKill - Remove the specified kill from the list of kills of
/// the specified val#.
static bool removeKill(VNInfo *VNI, unsigned KillIdx) {
- SmallVector<unsigned, 4> &kills = VNI->kills;
- SmallVector<unsigned, 4>::iterator
+ VNInfo::KillSet &kills = VNI->kills;
+ VNInfo::KillSet::iterator
I = std::lower_bound(kills.begin(), kills.end(), KillIdx);
- if (I != kills.end() && *I == KillIdx) {
+ if (I != kills.end() && I->killIdx == KillIdx) {
kills.erase(I);
return true;
}
@@ -380,10 +408,11 @@ namespace llvm {
/// removeKills - Remove all the kills in specified range
/// [Start, End] of the specified val#.
static void removeKills(VNInfo *VNI, unsigned Start, unsigned End) {
- SmallVector<unsigned, 4> &kills = VNI->kills;
- SmallVector<unsigned, 4>::iterator
+ VNInfo::KillSet &kills = VNI->kills;
+
+ VNInfo::KillSet::iterator
I = std::lower_bound(kills.begin(), kills.end(), Start);
- SmallVector<unsigned, 4>::iterator
+ VNInfo::KillSet::iterator
E = std::upper_bound(kills.begin(), kills.end(), End);
kills.erase(I, E);
}
@@ -391,15 +420,15 @@ namespace llvm {
/// isKill - Return true if the specified index is a kill of the
/// specified val#.
static bool isKill(const VNInfo *VNI, unsigned KillIdx) {
- const SmallVector<unsigned, 4> &kills = VNI->kills;
- SmallVector<unsigned, 4>::const_iterator
+ const VNInfo::KillSet &kills = VNI->kills;
+ VNInfo::KillSet::const_iterator
I = std::lower_bound(kills.begin(), kills.end(), KillIdx);
- return I != kills.end() && *I == KillIdx;
+ return I != kills.end() && I->killIdx == KillIdx;
}
/// isOnlyLROfValNo - Return true if the specified live range is the only
/// one defined by the its val#.
- bool isOnlyLROfValNo( const LiveRange *LR) {
+ bool isOnlyLROfValNo(const LiveRange *LR) {
for (const_iterator I = begin(), E = end(); I != E; ++I) {
const LiveRange *Tmp = I;
if (Tmp != LR && Tmp->valno == LR->valno)
@@ -481,6 +510,13 @@ namespace llvm {
return I == end() ? 0 : &*I;
}
+ /// getLiveRangeContaining - Return the live range that contains the
+ /// specified index, or null if there is none.
+ LiveRange *getLiveRangeContaining(unsigned Idx) {
+ iterator I = FindLiveRangeContaining(Idx);
+ return I == end() ? 0 : &*I;
+ }
+
/// FindLiveRangeContaining - Return an iterator to the live range that
/// contains the specified index, or end() if there is none.
const_iterator FindLiveRangeContaining(unsigned Idx) const;
diff --git a/include/llvm/CodeGen/LiveIntervalAnalysis.h b/include/llvm/CodeGen/LiveIntervalAnalysis.h
index 7ae98bb..40991e7 100644
--- a/include/llvm/CodeGen/LiveIntervalAnalysis.h
+++ b/include/llvm/CodeGen/LiveIntervalAnalysis.h
@@ -88,6 +88,8 @@ namespace llvm {
typedef DenseMap<unsigned, LiveInterval*> Reg2IntervalMap;
Reg2IntervalMap r2iMap_;
+ DenseMap<MachineBasicBlock*, unsigned> terminatorGaps;
+
BitVector allocatableRegs_;
std::vector<MachineInstr*> ClonedMIs;