[llvm-commits] [llvm] r54924 - in /llvm/trunk: include/llvm/CodeGen/LiveIntervalAnalysis.h lib/CodeGen/LiveIntervalAnalysis.cpp

Evan Cheng evan.cheng at apple.com
Mon Aug 18 11:35:33 PDT 2008


On Aug 18, 2008, at 11:05 AM, Owen Anderson wrote:

>
> +
> +  // since this is called after the analysis is done we don't know if
> +  // LiveVariables is available
> +  lv_ = getAnalysisToUpdate<LiveVariables>();

Thanks. Please remove dependency on LiveVariables. It's not there in  
the non-fast version.

Evan

>
> +
> +  std::vector<LiveInterval*> added;
> +
> +  assert(li.weight != HUGE_VALF &&
> +         "attempt to spill already spilled interval!");
> +
> +  DOUT << "\t\t\t\tadding intervals for spills for interval: ";
> +  DEBUG(li.dump());
> +  DOUT << '\n';
> +
> +  const TargetRegisterClass* rc = mri_->getRegClass(li.reg);
> +
> +  for (LiveInterval::Ranges::const_iterator
> +         i = li.ranges.begin(), e = li.ranges.end(); i != e; ++i) {
> +    unsigned index = getBaseIndex(i->start);
> +    unsigned end = getBaseIndex(i->end-1) + InstrSlots::NUM;
> +    for (; index != end; index += InstrSlots::NUM) {
> +      // skip deleted instructions
> +      while (index != end && !getInstructionFromIndex(index))
> +        index += InstrSlots::NUM;
> +      if (index == end) break;
> +
> +      MachineInstr *MI = getInstructionFromIndex(index);
> +
> +      for (unsigned i = 0; i != MI->getNumOperands(); ++i) {
> +        MachineOperand& mop = MI->getOperand(i);
> +        if (mop.isRegister() && mop.getReg() == li.reg) {
> +          // Create a new virtual register for the spill interval.
> +          unsigned NewVReg = mri_->createVirtualRegister(rc);
> +
> +          // Scan all of the operands of this instruction rewriting  
> operands
> +          // to use NewVReg instead of li.reg as appropriate.  We  
> do this for
> +          // two reasons:
> +          //
> +          //   1. If the instr reads the same spilled vreg multiple  
> times, we
> +          //      want to reuse the NewVReg.
> +          //   2. If the instr is a two-addr instruction, we are  
> required to
> +          //      keep the src/dst regs pinned.
> +          //
> +          // Keep track of whether we replace a use and/or def so  
> that we can
> +          // create the spill interval with the appropriate range.
> +          mop.setReg(NewVReg);
> +
> +          bool HasUse = mop.isUse();
> +          bool HasDef = mop.isDef();
> +          for (unsigned j = i+1, e = MI->getNumOperands(); j != e; + 
> +j) {
> +            if (MI->getOperand(j).isReg() &&
> +                MI->getOperand(j).getReg() == li.reg) {
> +              MI->getOperand(j).setReg(NewVReg);
> +              HasUse |= MI->getOperand(j).isUse();
> +              HasDef |= MI->getOperand(j).isDef();
> +            }
> +          }
> +
> +          // create a new register for this spill
> +          vrm.grow();
> +          vrm.assignVirt2StackSlot(NewVReg, slot);
> +          LiveInterval &nI = getOrCreateInterval(NewVReg);
> +          assert(nI.empty());
> +
> +          // the spill weight is now infinity as it
> +          // cannot be spilled again
> +          nI.weight = HUGE_VALF;
> +
> +          if (HasUse) {
> +            LiveRange LR(getLoadIndex(index), getUseIndex(index),
> +                         nI.getNextValue(~0U, 0,  
> getVNInfoAllocator()));
> +            DOUT << " +" << LR;
> +            nI.addRange(LR);
> +          }
> +          if (HasDef) {
> +            LiveRange LR(getDefIndex(index), getStoreIndex(index),
> +                         nI.getNextValue(~0U, 0,  
> getVNInfoAllocator()));
> +            DOUT << " +" << LR;
> +            nI.addRange(LR);
> +          }
> +
> +          added.push_back(&nI);
> +
> +          // update live variables if it is available
> +          if (lv_)
> +            lv_->addVirtualRegisterKilled(NewVReg, MI);
> +
> +          DOUT << "\t\t\t\tadded new interval: ";
> +          DEBUG(nI.dump());
> +          DOUT << '\n';
> +        }
> +      }
> +    }
> +  }
> +
> +  SSWeight = HUGE_VALF;
> +
> +  return added;
> +}
> +
> +std::vector<LiveInterval*> LiveIntervals::
> addIntervalsForSpills(const LiveInterval &li,
>                       const MachineLoopInfo *loopInfo, VirtRegMap  
> &vrm,
>                       float &SSWeight) {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list