| Index: src/IceCfgNode.cpp
|
| diff --git a/src/IceCfgNode.cpp b/src/IceCfgNode.cpp
|
| index fb2ab396c25b04507549c76b73a899e473558818..19c5d22d731879dff9ab258632028102dc234317 100644
|
| --- a/src/IceCfgNode.cpp
|
| +++ b/src/IceCfgNode.cpp
|
| @@ -794,20 +794,30 @@ void emitRegisterUsage(Ostream &Str, const Cfg *Func, const CfgNode *Node,
|
| Str << "\t\t\t\t# LiveOut=";
|
| }
|
| if (!Live->empty()) {
|
| - bool First = true;
|
| + std::vector<Variable *> LiveRegs;
|
| for (SizeT i = 0; i < Live->size(); ++i) {
|
| if ((*Live)[i]) {
|
| Variable *Var = Liveness->getVariable(i, Node);
|
| if (Var->hasReg()) {
|
| if (IsLiveIn)
|
| ++LiveRegCount[Var->getRegNum()];
|
| - if (!First)
|
| - Str << ",";
|
| - First = false;
|
| - Var->emit(Func);
|
| + LiveRegs.push_back(Var);
|
| }
|
| }
|
| }
|
| + // Sort the variables by regnum so they are always printed in a
|
| + // familiar order.
|
| + std::sort(LiveRegs.begin(), LiveRegs.end(),
|
| + [](const Variable *V1, const Variable *V2) {
|
| + return V1->getRegNum() < V2->getRegNum();
|
| + });
|
| + bool First = true;
|
| + for (Variable *Var : LiveRegs) {
|
| + if (!First)
|
| + Str << ",";
|
| + First = false;
|
| + Var->emit(Func);
|
| + }
|
| }
|
| Str << "\n";
|
| }
|
| @@ -825,8 +835,14 @@ void emitLiveRangesEnded(Ostream &Str, const Cfg *Func, const Inst *Instr,
|
| SizeT NumVars = Src->getNumVars();
|
| for (SizeT J = 0; J < NumVars; ++J) {
|
| const Variable *Var = Src->getVar(J);
|
| - if (Instr->isLastUse(Var) &&
|
| - (!Var->hasReg() || --LiveRegCount[Var->getRegNum()] == 0)) {
|
| + bool ShouldEmit = Instr->isLastUse(Var);
|
| + if (Var->hasReg()) {
|
| + // Don't report end of live range until the live count reaches 0.
|
| + SizeT NewCount = --LiveRegCount[Var->getRegNum()];
|
| + if (NewCount)
|
| + ShouldEmit = false;
|
| + }
|
| + if (ShouldEmit) {
|
| if (First)
|
| Str << " \t# END=";
|
| else
|
| @@ -884,12 +900,8 @@ void CfgNode::emit(Cfg *Func) const {
|
| for (const Inst &I : Insts) {
|
| if (I.isDeleted())
|
| continue;
|
| - if (I.isRedundantAssign()) {
|
| - Variable *Dest = I.getDest();
|
| - if (DecorateAsm && Dest->hasReg() && !I.isLastUse(I.getSrc(0)))
|
| - ++LiveRegCount[Dest->getRegNum()];
|
| + if (I.isRedundantAssign())
|
| continue;
|
| - }
|
| I.emit(Func);
|
| if (DecorateAsm)
|
| emitLiveRangesEnded(Str, Func, &I, LiveRegCount);
|
|
|