Subzero: Completely remove tracking of stack pointer live range.
Specifically, if a variable is marked with IgnoreLiveness=true, then:
1. Completely avoid adding any segments to its live range
2. Assert that no one tries to add segments to its live range
This is done in part by incorporating Variable::IgnoreLiveness into Liveness::RangeMask.
Also, change a functor into a lambda because C++11.
BUG= none
R=jvoung@chromium.org
Review URL: https://codereview.chromium.org/1273823003.
diff --git a/src/IceCfgNode.cpp b/src/IceCfgNode.cpp
index 44e9d3e..462cbcb 100644
--- a/src/IceCfgNode.cpp
+++ b/src/IceCfgNode.cpp
@@ -667,15 +667,13 @@
std::sort(MapBegin.begin(), MapBegin.end());
std::sort(MapEnd.begin(), MapEnd.end());
// Verify there are no duplicates.
- struct ComparePair {
- bool operator()(const LiveBeginEndMapEntry &A,
- const LiveBeginEndMapEntry &B) {
- return A.first == B.first;
- }
- };
- assert(std::adjacent_find(MapBegin.begin(), MapBegin.end(), ComparePair()) ==
+ auto ComparePair =
+ [](const LiveBeginEndMapEntry &A, const LiveBeginEndMapEntry &B) {
+ return A.first == B.first;
+ };
+ assert(std::adjacent_find(MapBegin.begin(), MapBegin.end(), ComparePair) ==
MapBegin.end());
- assert(std::adjacent_find(MapEnd.begin(), MapEnd.end(), ComparePair()) ==
+ assert(std::adjacent_find(MapEnd.begin(), MapEnd.end(), ComparePair) ==
MapEnd.end());
LivenessBV LiveInAndOut = LiveIn;
@@ -700,21 +698,16 @@
InstNumberT LE = i == i2 ? IEB->second : LastInstNum + 1;
Variable *Var = Liveness->getVariable(i, this);
- // TODO(stichnot): Push getIgnoreLiveness() into the initialization of
- // Liveness::RangeMask so that LiveBegin and LiveEnd never even reference
- // such variables.
- if (!Var->getIgnoreLiveness()) {
- if (LB > LE) {
- Var->addLiveRange(FirstInstNum, LE, 1);
- Var->addLiveRange(LB, LastInstNum + 1, 1);
- // Assert that Var is a global variable by checking that its
- // liveness index is less than the number of globals. This
- // ensures that the LiveInAndOut[] access is valid.
- assert(i < Liveness->getNumGlobalVars());
- LiveInAndOut[i] = false;
- } else {
- Var->addLiveRange(LB, LE, 1);
- }
+ if (LB > LE) {
+ Var->addLiveRange(FirstInstNum, LE, 1);
+ Var->addLiveRange(LB, LastInstNum + 1, 1);
+ // Assert that Var is a global variable by checking that its
+ // liveness index is less than the number of globals. This
+ // ensures that the LiveInAndOut[] access is valid.
+ assert(i < Liveness->getNumGlobalVars());
+ LiveInAndOut[i] = false;
+ } else {
+ Var->addLiveRange(LB, LE, 1);
}
if (i == i1)
++IBB;
diff --git a/src/IceLiveness.cpp b/src/IceLiveness.cpp
index a1de893..35e12b7 100644
--- a/src/IceLiveness.cpp
+++ b/src/IceLiveness.cpp
@@ -71,8 +71,12 @@
if (IsFullInit)
LiveToVarMap.assign(NumGlobals, nullptr);
- // Sort each variable into the appropriate LiveToVarMap. Also set
- // VarToLiveMap.
+ // Initialize the bitmask of which variables to track.
+ RangeMask.resize(NumVars);
+ RangeMask.set(0, NumVars); // Track all variables by default.
+
+ // Sort each variable into the appropriate LiveToVarMap. Set VarToLiveMap.
+ // Set RangeMask correctly for each variable.
TmpNumGlobals = 0;
for (auto I = FirstVar, E = Func->getVariables().end(); I != E; ++I) {
Variable *Var = *I;
@@ -88,9 +92,20 @@
LiveIndex += NumGlobals;
}
VarToLiveMap[VarIndex] = LiveIndex;
+ if (Var->getIgnoreLiveness())
+ RangeMask[VarIndex] = false;
}
assert(TmpNumGlobals == (IsFullInit ? NumGlobals : 0));
+ // Fix up RangeMask for variables before FirstVar.
+ for (auto I = Func->getVariables().begin(); I != FirstVar; ++I) {
+ Variable *Var = *I;
+ SizeT VarIndex = Var->getIndex();
+ if (Var->getIgnoreLiveness() ||
+ (!IsFullInit && !Var->hasReg() && !Var->getWeight().isInf()))
+ RangeMask[VarIndex] = false;
+ }
+
// Process each node.
for (auto I = FirstNode, E = Func->getNodes().end(); I != E; ++I) {
LivenessNode &Node = Nodes[(*I)->getIndex()];
@@ -100,17 +115,6 @@
// LiveBegin and LiveEnd are reinitialized before each pass over
// the block.
}
-
- // Initialize the bitmask of which variables to track.
- RangeMask.resize(NumVars);
- RangeMask.set(0, NumVars);
- if (!IsFullInit) {
- // Reset initial variables that are not pre-colored or infinite-weight.
- for (auto I = Func->getVariables().begin(); I != FirstVar; ++I) {
- Variable *Var = *I;
- RangeMask[Var->getIndex()] = (Var->hasReg() || Var->getWeight().isInf());
- }
- }
}
void Liveness::init() {
diff --git a/src/IceOperand.h b/src/IceOperand.h
index 5bf4676..bcb38d0 100644
--- a/src/IceOperand.h
+++ b/src/IceOperand.h
@@ -463,6 +463,7 @@
void setLiveRange(const LiveRange &Range) { Live = Range; }
void resetLiveRange() { Live.reset(); }
void addLiveRange(InstNumberT Start, InstNumberT End, uint32_t WeightDelta) {
+ assert(!getIgnoreLiveness());
assert(WeightDelta != RegWeight::Inf);
Live.addSegment(Start, End);
if (Weight.isInf())
diff --git a/src/IceRegAlloc.cpp b/src/IceRegAlloc.cpp
index c651ae2..d0dc3fb 100644
--- a/src/IceRegAlloc.cpp
+++ b/src/IceRegAlloc.cpp
@@ -178,7 +178,8 @@
if (Inst.isDeleted())
continue;
if (const Variable *Var = Inst.getDest()) {
- if (Var->hasReg() || Var->getWeight().isInf()) {
+ if (!Var->getIgnoreLiveness() &&
+ (Var->hasReg() || Var->getWeight().isInf())) {
if (LRBegin[Var->getIndex()] == Inst::NumberSentinel) {
LRBegin[Var->getIndex()] = Inst.getNumber();
++NumVars;
@@ -190,6 +191,8 @@
SizeT NumVars = Src->getNumVars();
for (SizeT J = 0; J < NumVars; ++J) {
const Variable *Var = Src->getVar(J);
+ if (Var->getIgnoreLiveness())
+ continue;
if (Var->hasReg() || Var->getWeight().isInf())
LREnd[Var->getIndex()] = Inst.getNumber();
}