diff options
Diffstat (limited to 'lib/CodeGen/CalcSpillWeights.cpp')
| -rw-r--r-- | lib/CodeGen/CalcSpillWeights.cpp | 24 | 
1 files changed, 15 insertions, 9 deletions
| diff --git a/lib/CodeGen/CalcSpillWeights.cpp b/lib/CodeGen/CalcSpillWeights.cpp index 4925c4db1e0a..bc033f96bcf2 100644 --- a/lib/CodeGen/CalcSpillWeights.cpp +++ b/lib/CodeGen/CalcSpillWeights.cpp @@ -7,8 +7,6 @@  //  //===----------------------------------------------------------------------===// -#define DEBUG_TYPE "calcspillweights" -  #include "llvm/CodeGen/CalcSpillWeights.h"  #include "llvm/CodeGen/LiveIntervalAnalysis.h"  #include "llvm/CodeGen/MachineBlockFrequencyInfo.h" @@ -22,6 +20,8 @@  #include "llvm/Target/TargetRegisterInfo.h"  using namespace llvm; +#define DEBUG_TYPE "calcspillweights" +  void llvm::calculateSpillWeightsAndHints(LiveIntervals &LIS,                             MachineFunction &MF,                             const MachineLoopInfo &MLI, @@ -96,8 +96,8 @@ void  VirtRegAuxInfo::calculateSpillWeightAndHint(LiveInterval &li) {    MachineRegisterInfo &mri = MF.getRegInfo();    const TargetRegisterInfo &tri = *MF.getTarget().getRegisterInfo(); -  MachineBasicBlock *mbb = 0; -  MachineLoop *loop = 0; +  MachineBasicBlock *mbb = nullptr; +  MachineLoop *loop = nullptr;    bool isExiting = false;    float totalWeight = 0;    SmallPtrSet<MachineInstr*, 8> visited; @@ -112,8 +112,10 @@ VirtRegAuxInfo::calculateSpillWeightAndHint(LiveInterval &li) {    // Don't recompute spill weight for an unspillable register.    bool Spillable = li.isSpillable(); -  for (MachineRegisterInfo::reg_iterator I = mri.reg_begin(li.reg); -       MachineInstr *mi = I.skipInstruction();) { +  for (MachineRegisterInfo::reg_instr_iterator +       I = mri.reg_instr_begin(li.reg), E = mri.reg_instr_end(); +       I != E; ) { +    MachineInstr *mi = &*(I++);      if (mi->isIdentityCopy() || mi->isImplicitDef() || mi->isDebugValue())        continue;      if (!visited.insert(mi)) @@ -130,9 +132,9 @@ VirtRegAuxInfo::calculateSpillWeightAndHint(LiveInterval &li) {        // Calculate instr weight.        bool reads, writes; -      tie(reads, writes) = mi->readsWritesVirtualRegister(li.reg); +      std::tie(reads, writes) = mi->readsWritesVirtualRegister(li.reg);        weight = LiveIntervals::getSpillWeight( -          writes, reads, MBFI.getBlockFreq(mi->getParent())); +        writes, reads, &MBFI, mi);        // Give extra weight to what looks like a loop induction variable update.        if (writes && isExiting && LIS.isLiveOutOfMBB(li, mbb)) @@ -147,7 +149,11 @@ VirtRegAuxInfo::calculateSpillWeightAndHint(LiveInterval &li) {      unsigned hint = copyHint(mi, li.reg, tri, mri);      if (!hint)        continue; -    float hweight = Hint[hint] += weight; +    // Force hweight onto the stack so that x86 doesn't add hidden precision, +    // making the comparison incorrectly pass (i.e., 1 > 1 == true??). +    // +    // FIXME: we probably shouldn't use floats at all. +    volatile float hweight = Hint[hint] += weight;      if (TargetRegisterInfo::isPhysicalRegister(hint)) {        if (hweight > bestPhys && mri.isAllocatable(hint))          bestPhys = hweight, hintPhys = hint; | 
