Weight variables for register allocation by their number of uses.
Count the number of instructions that use a variable following the heuristic
that more uses implies higher register priority. This is currently very simple
but is precursor work for weighting variables by loop nest depth.
BUG=
R=jvoung@chromium.org
Review URL: https://codereview.chromium.org/1312433004.
diff --git a/src/IceTargetLoweringARM32.cpp b/src/IceTargetLoweringARM32.cpp
index c3d05a2..9b10eff 100644
--- a/src/IceTargetLoweringARM32.cpp
+++ b/src/IceTargetLoweringARM32.cpp
@@ -410,7 +410,7 @@
Str << getRegName(Var->getRegNum(), Var->getType());
return;
}
- if (Var->getWeight().isInf()) {
+ if (Var->mustHaveReg()) {
llvm::report_fatal_error(
"Infinite-weight Variable has no register assigned");
}
@@ -907,7 +907,7 @@
else
_add(ScratchReg, OrigBaseReg, OffsetVal);
StackVariable *NewVar = Func->makeVariable<StackVariable>(stackSlotType());
- NewVar->setWeight(RegWeight::Zero);
+ NewVar->setMustNotHaveReg();
NewVar->setBaseRegNum(ScratchReg->getRegNum());
constexpr int32_t NewOffset = 0;
NewVar->setStackOffset(NewOffset);
@@ -984,7 +984,7 @@
if (isLegalVariableStackOffset(OffsetDiff)) {
StackVariable *NewDest =
Func->makeVariable<StackVariable>(stackSlotType());
- NewDest->setWeight(RegWeight::Zero);
+ NewDest->setMustNotHaveReg();
NewDest->setBaseRegNum(NewBaseReg->getBaseRegNum());
NewDest->setStackOffset(OffsetDiff);
Variable *NewDestVar = NewDest;
@@ -1014,7 +1014,7 @@
if (isLegalVariableStackOffset(OffsetDiff)) {
StackVariable *NewVar =
Func->makeVariable<StackVariable>(stackSlotType());
- NewVar->setWeight(RegWeight::Zero);
+ NewVar->setMustNotHaveReg();
NewVar->setBaseRegNum(NewBaseReg->getBaseRegNum());
NewVar->setStackOffset(OffsetDiff);
_mov(Dest, NewVar);
@@ -2834,7 +2834,7 @@
// Check if the variable is guaranteed a physical register. This
// can happen either when the variable is pre-colored or when it is
// assigned infinite weight.
- bool MustHaveRegister = (Var->hasReg() || Var->getWeight().isInf());
+ bool MustHaveRegister = (Var->hasReg() || Var->mustHaveReg());
// We need a new physical register for the operand if:
// Mem is not allowed and Var isn't guaranteed a physical
// register, or
@@ -2899,7 +2899,7 @@
assert(Type != IceType_i64);
Variable *Reg = Func->makeVariable(Type);
if (RegNum == Variable::NoRegister)
- Reg->setWeightInfinite();
+ Reg->setMustHaveReg();
else
Reg->setRegNum(RegNum);
return Reg;