diff options
Diffstat (limited to 'lib/CodeGen/CalcSpillWeights.cpp')
| -rw-r--r-- | lib/CodeGen/CalcSpillWeights.cpp | 41 |
1 files changed, 9 insertions, 32 deletions
diff --git a/lib/CodeGen/CalcSpillWeights.cpp b/lib/CodeGen/CalcSpillWeights.cpp index 57541182cab2..02347b9f0b5c 100644 --- a/lib/CodeGen/CalcSpillWeights.cpp +++ b/lib/CodeGen/CalcSpillWeights.cpp @@ -70,15 +70,6 @@ static unsigned copyHint(const MachineInstr *mi, unsigned reg, return sub == hsub ? hreg : 0; const TargetRegisterClass *rc = mri.getRegClass(reg); - if (!tri.enableMultipleCopyHints()) { - // Only allow physreg hints in rc. - if (sub == 0) - return rc->contains(hreg) ? hreg : 0; - - // reg:sub should match the physreg hreg. - return tri.getMatchingSuperReg(hreg, sub, rc); - } - unsigned CopiedPReg = (hsub ? tri.getSubReg(hreg, hsub) : hreg); if (rc->contains(CopiedPReg)) return CopiedPReg; @@ -199,31 +190,19 @@ float VirtRegAuxInfo::weightCalcHelper(LiveInterval &li, SlotIndex *start, unsigned Reg; float Weight; bool IsPhys; - unsigned HintOrder; - CopyHint(unsigned R, float W, bool P, unsigned HR) : - Reg(R), Weight(W), IsPhys(P), HintOrder(HR) {} + CopyHint(unsigned R, float W, bool P) : + Reg(R), Weight(W), IsPhys(P) {} bool operator<(const CopyHint &rhs) const { // Always prefer any physreg hint. if (IsPhys != rhs.IsPhys) return (IsPhys && !rhs.IsPhys); if (Weight != rhs.Weight) return (Weight > rhs.Weight); - - // This is just a temporary way to achive NFC for targets that don't - // enable multiple copy hints. HintOrder should be removed when all - // targets return true in enableMultipleCopyHints(). - return (HintOrder < rhs.HintOrder); - -#if 0 // Should replace the HintOrder check, see above. - // (just for the purpose of maintaining the set) - return Reg < rhs.Reg; -#endif + return Reg < rhs.Reg; // Tie-breaker. } }; std::set<CopyHint> CopyHints; - // Temporary: see comment for HintOrder above. - unsigned CopyHintOrder = 0; for (MachineRegisterInfo::reg_instr_iterator I = mri.reg_instr_begin(li.reg), E = mri.reg_instr_end(); I != E; ) { @@ -263,8 +242,7 @@ float VirtRegAuxInfo::weightCalcHelper(LiveInterval &li, SlotIndex *start, } // Get allocation hints from copies. - if (!mi->isCopy() || - (TargetHint.first != 0 && !tri.enableMultipleCopyHints())) + if (!mi->isCopy()) continue; unsigned hint = copyHint(mi, li.reg, tri, mri); if (!hint) @@ -275,8 +253,7 @@ float VirtRegAuxInfo::weightCalcHelper(LiveInterval &li, SlotIndex *start, // FIXME: we probably shouldn't use floats at all. volatile float hweight = Hint[hint] += weight; if (TargetRegisterInfo::isVirtualRegister(hint) || mri.isAllocatable(hint)) - CopyHints.insert(CopyHint(hint, hweight, tri.isPhysicalRegister(hint), - (tri.enableMultipleCopyHints() ? hint : CopyHintOrder++))); + CopyHints.insert(CopyHint(hint, hweight, tri.isPhysicalRegister(hint))); } Hint.clear(); @@ -287,13 +264,13 @@ float VirtRegAuxInfo::weightCalcHelper(LiveInterval &li, SlotIndex *start, if (TargetHint.first == 0 && TargetHint.second) mri.clearSimpleHint(li.reg); + std::set<unsigned> HintedRegs; for (auto &Hint : CopyHints) { - if (TargetHint.first != 0 && Hint.Reg == TargetHint.second) - // Don't add again the target-type hint. + if (!HintedRegs.insert(Hint.Reg).second || + (TargetHint.first != 0 && Hint.Reg == TargetHint.second)) + // Don't add the same reg twice or the target-type hint again. continue; mri.addRegAllocationHint(li.reg, Hint.Reg); - if (!tri.enableMultipleCopyHints()) - break; } // Weakly boost the spill weight of hinted registers. |
