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/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() {