[llvm-commits] [llvm] r112741 - /llvm/trunk/lib/CodeGen/RegAllocLinearScan.cpp

Evan Cheng evan.cheng at apple.com
Thu Sep 9 23:49:55 PDT 2010


To me it seems like tri_->getAllocatableSet(fn), allocation_order_begin, allocation_order_end should not include reserved registers. After all, their names implied as such.

Wouldn't every register allocator needs to do the same check?

Evan

On Sep 1, 2010, at 2:04 PM, Jim Grosbach wrote:

> Author: grosbach
> Date: Wed Sep  1 16:04:27 2010
> New Revision: 112741
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=112741&view=rev
> Log:
> The register allocator shouldn't consider allocating reserved registers.
> r112728 did this for fast regalloc.
> 
> Modified:
>    llvm/trunk/lib/CodeGen/RegAllocLinearScan.cpp
> 
> Modified: llvm/trunk/lib/CodeGen/RegAllocLinearScan.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RegAllocLinearScan.cpp?rev=112741&r1=112740&r2=112741&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/RegAllocLinearScan.cpp (original)
> +++ llvm/trunk/lib/CodeGen/RegAllocLinearScan.cpp Wed Sep  1 16:04:27 2010
> @@ -125,6 +125,7 @@
>     const TargetRegisterInfo* tri_;
>     const TargetInstrInfo* tii_;
>     BitVector allocatableRegs_;
> +    BitVector reservedRegs_;
>     LiveIntervals* li_;
>     LiveStacks* ls_;
>     MachineLoopInfo *loopInfo;
> @@ -464,6 +465,7 @@
>   tri_ = tm_->getRegisterInfo();
>   tii_ = tm_->getInstrInfo();
>   allocatableRegs_ = tri_->getAllocatableSet(fn);
> +  reservedRegs_ = tri_->getReservedRegs(fn);
>   li_ = &getAnalysis<LiveIntervals>();
>   ls_ = &getAnalysis<LiveStacks>();
>   loopInfo = &getAnalysis<MachineLoopInfo>();
> @@ -949,8 +951,14 @@
>   const TargetRegisterClass *RC = mri_->getRegClass(cur->reg);
>   if (cur->empty()) {
>     unsigned physReg = vrm_->getRegAllocPref(cur->reg);
> -    if (!physReg)
> -      physReg = *RC->allocation_order_begin(*mf_);
> +    if (!physReg) {
> +      TargetRegisterClass::iterator aoe = RC->allocation_order_end(*mf_);
> +      TargetRegisterClass::iterator i = RC->allocation_order_begin(*mf_);
> +      while (reservedRegs_.test(*i) && i != aoe)
> +        ++i;
> +      assert(i != aoe && "All registers reserved?!");
> +      physReg = *i;
> +    }
>     DEBUG(dbgs() <<  tri_->getName(physReg) << '\n');
>     // Note the register is not really in use.
>     vrm_->assignVirt2Phys(cur->reg, physReg);
> @@ -1133,8 +1141,9 @@
>            e = RC->allocation_order_end(*mf_); i != e; ++i) {
>       unsigned reg = *i;
>       float regWeight = SpillWeights[reg];
> -      // Skip recently allocated registers.
> -      if (minWeight > regWeight && !isRecentlyUsed(reg))
> +      // Skip recently allocated registers and reserved registers.
> +      if (minWeight > regWeight && !isRecentlyUsed(reg) &&
> +          !reservedRegs_.test(reg))
>         Found = true;
>       RegsWeights.push_back(std::make_pair(reg, regWeight));
>     }
> @@ -1144,6 +1153,8 @@
>     for (TargetRegisterClass::iterator i = RC->allocation_order_begin(*mf_),
>            e = RC->allocation_order_end(*mf_); i != e; ++i) {
>       unsigned reg = *i;
> +      if (reservedRegs_.test(reg))
> +        continue;
>       // No need to worry about if the alias register size < regsize of RC.
>       // We are going to spill all registers that alias it anyway.
>       for (const unsigned* as = tri_->getAliasSet(reg); *as; ++as)
> @@ -1157,7 +1168,15 @@
>   minWeight = RegsWeights[0].second;
>   if (minWeight == HUGE_VALF) {
>     // All registers must have inf weight. Just grab one!
> -    minReg = BestPhysReg ? BestPhysReg : *RC->allocation_order_begin(*mf_);
> +    if (BestPhysReg == 0) {
> +      TargetRegisterClass::iterator aoe = RC->allocation_order_end(*mf_);
> +      TargetRegisterClass::iterator i = RC->allocation_order_begin(*mf_);
> +      while (reservedRegs_.test(*i) && i != aoe)
> +        ++i;
> +      assert(i != aoe && "All registers reserved?!");
> +      minReg = *i;
> +    } else
> +      minReg = BestPhysReg;
>     if (cur->weight == HUGE_VALF ||
>         li_->getApproximateInstructionCount(*cur) == 0) {
>       // Spill a physical register around defs and uses.
> @@ -1414,6 +1433,9 @@
>     // Ignore "downgraded" registers.
>     if (SkipDGRegs && DowngradedRegs.count(Reg))
>       continue;
> +    // Skip reserved registers.
> +    if (reservedRegs_.test(Reg))
> +      continue;
>     // Skip recently allocated registers.
>     if (isRegAvail(Reg) && !isRecentlyUsed(Reg)) {
>       FreeReg = Reg;
> @@ -1442,6 +1464,9 @@
>     // Ignore "downgraded" registers.
>     if (SkipDGRegs && DowngradedRegs.count(Reg))
>       continue;
> +    // Skip reserved registers.
> +    if (reservedRegs_.test(Reg))
> +      continue;
>     if (isRegAvail(Reg) && Reg < inactiveCounts.size() &&
>         FreeRegInactiveCount < inactiveCounts[Reg] && !isRecentlyUsed(Reg)) {
>       FreeReg = Reg;
> 
> 
> _______________________________________________
> 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