Index: src/IceInst.cpp |
diff --git a/src/IceInst.cpp b/src/IceInst.cpp |
index 57b0bd1ec055e8adaf6e6010a462210cf30fc38b..4aa6e6947fc030c5c14ba32faa8ee07b21c9b2c0 100644 |
--- a/src/IceInst.cpp |
+++ b/src/IceInst.cpp |
@@ -71,7 +71,8 @@ const struct InstIcmpAttributes_ { |
Inst::Inst(Cfg *Func, InstKind Kind, SizeT MaxSrcs, Variable *Dest) |
: Kind(Kind), Number(Func->newInstNumber()), Deleted(false), Dead(false), |
- HasSideEffects(false), Dest(Dest), MaxSrcs(MaxSrcs), NumSrcs(0), |
+ HasSideEffects(false), IsDestNonKillable(false), Dest(Dest), |
+ MaxSrcs(MaxSrcs), NumSrcs(0), |
Srcs(Func->allocateArrayOf<Operand *>(MaxSrcs)), LiveRangesEnded(0) {} |
// Assign the instruction a new number. |
@@ -111,18 +112,19 @@ bool Inst::isLastUse(const Operand *TestSrc) const { |
return false; |
} |
-void Inst::livenessLightweight(Cfg *Func, llvm::BitVector &Live) { |
+void Inst::livenessLightweight(Cfg *Func, LivenessBV &Live) { |
assert(!isDeleted()); |
if (llvm::isa<InstFakeKill>(this)) |
return; |
resetLastUses(); |
+ VariablesMetadata *VMetadata = Func->getVMetadata(); |
SizeT VarIndex = 0; |
for (SizeT I = 0; I < getSrcSize(); ++I) { |
Operand *Src = getSrc(I); |
SizeT NumVars = Src->getNumVars(); |
for (SizeT J = 0; J < NumVars; ++J, ++VarIndex) { |
const Variable *Var = Src->getVar(J); |
- if (Func->getVMetadata()->isMultiBlock(Var)) |
+ if (VMetadata->isMultiBlock(Var)) |
continue; |
SizeT Index = Var->getIndex(); |
if (Live[Index]) |
@@ -133,20 +135,23 @@ void Inst::livenessLightweight(Cfg *Func, llvm::BitVector &Live) { |
} |
} |
-void Inst::liveness(InstNumberT InstNumber, llvm::BitVector &Live, |
- Liveness *Liveness, const CfgNode *Node) { |
+void Inst::liveness(InstNumberT InstNumber, LivenessBV &Live, |
+ Liveness *Liveness, LiveBeginEndMap *LiveBegin, |
+ LiveBeginEndMap *LiveEnd) { |
assert(!isDeleted()); |
if (llvm::isa<InstFakeKill>(this)) |
return; |
- std::vector<InstNumberT> &LiveBegin = Liveness->getLiveBegin(Node); |
- std::vector<InstNumberT> &LiveEnd = Liveness->getLiveEnd(Node); |
Dead = false; |
if (Dest) { |
- SizeT VarNum = Liveness->getLiveIndex(Dest); |
+ SizeT VarNum = Liveness->getLiveIndex(Dest->getIndex()); |
if (Live[VarNum]) { |
- Live[VarNum] = false; |
- LiveBegin[VarNum] = InstNumber; |
+ if (!isDestNonKillable()) { |
+ Live[VarNum] = false; |
+ if (LiveBegin) { |
+ LiveBegin->push_back(std::make_pair(VarNum, InstNumber)); |
+ } |
+ } |
} else { |
if (!hasSideEffects()) |
Dead = true; |
@@ -164,7 +169,7 @@ void Inst::liveness(InstNumberT InstNumber, llvm::BitVector &Live, |
SizeT NumVars = Src->getNumVars(); |
for (SizeT J = 0; J < NumVars; ++J, ++VarIndex) { |
const Variable *Var = Src->getVar(J); |
- SizeT VarNum = Liveness->getLiveIndex(Var); |
+ SizeT VarNum = Liveness->getLiveIndex(Var->getIndex()); |
if (!Live[VarNum]) { |
setLastUse(VarIndex); |
if (!IsPhi) { |
@@ -185,8 +190,13 @@ void Inst::liveness(InstNumberT InstNumber, llvm::BitVector &Live, |
// setting it only when LiveEnd[VarNum]==0 (sentinel value). |
// Note that it's OK to set LiveBegin multiple times because |
// of the backwards traversal. |
- if (LiveEnd[VarNum] == 0) { |
- LiveEnd[VarNum] = InstNumber; |
+ if (LiveEnd) { |
+ // Ideally, we would verify that VarNum wasn't already |
+ // added in this block, but this can't be done very |
+ // efficiently with LiveEnd as a vector. Instead, |
+ // livenessPostprocess() verifies this after the vector |
+ // has been sorted. |
+ LiveEnd->push_back(std::make_pair(VarNum, InstNumber)); |
} |
} |
} |
@@ -320,14 +330,14 @@ Operand *InstPhi::getOperandForTarget(CfgNode *Target) const { |
// Updates liveness for a particular operand based on the given |
// predecessor edge. Doesn't mark the operand as live if the Phi |
// instruction is dead or deleted. |
-void InstPhi::livenessPhiOperand(llvm::BitVector &Live, CfgNode *Target, |
+void InstPhi::livenessPhiOperand(LivenessBV &Live, CfgNode *Target, |
Liveness *Liveness) { |
if (isDeleted() || Dead) |
return; |
for (SizeT I = 0; I < getSrcSize(); ++I) { |
if (Labels[I] == Target) { |
if (Variable *Var = llvm::dyn_cast<Variable>(getSrc(I))) { |
- SizeT SrcIndex = Liveness->getLiveIndex(Var); |
+ SizeT SrcIndex = Liveness->getLiveIndex(Var->getIndex()); |
if (!Live[SrcIndex]) { |
setLastUse(I); |
Live[SrcIndex] = true; |