[llvm-commits] [llvm] r98023 - /llvm/trunk/lib/CodeGen/SimpleRegisterCoalescing.cpp

Evan Cheng evan.cheng at apple.com
Mon Mar 8 17:23:49 PST 2010


Is 1000 scientific? :-)

Evan

On Mar 8, 2010, at 4:59 PM, Jakob Stoklund Olesen wrote:

> Author: stoklund
> Date: Mon Mar  8 18:59:48 2010
> New Revision: 98023
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=98023&view=rev
> Log:
> Disable physical register coalescing when the number of live ranges for the
> physreg becomes ridiculously high.
> 
> std::upper_bound may be log(N), but for sufficiently large live intervals, it
> becomes log(N)*cachemiss = a long long time.
> 
> This patch improves coalescer time by 4500x for a function with 20000
> function calls. The generated code is different, but not significantly worse -
> the allocator hints are almost as good as physreg coalescing anyway.
> 
> Modified:
>    llvm/trunk/lib/CodeGen/SimpleRegisterCoalescing.cpp
> 
> Modified: llvm/trunk/lib/CodeGen/SimpleRegisterCoalescing.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SimpleRegisterCoalescing.cpp?rev=98023&r1=98022&r2=98023&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SimpleRegisterCoalescing.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SimpleRegisterCoalescing.cpp Mon Mar  8 18:59:48 2010
> @@ -1671,8 +1671,20 @@
>         // density, do not join them, instead mark the physical register as its
>         // allocation preference.
>         LiveInterval &JoinVInt = SrcIsPhys ? DstInt : SrcInt;
> +        LiveInterval &JoinPInt = SrcIsPhys ? SrcInt : DstInt;
>         unsigned JoinVReg = SrcIsPhys ? DstReg : SrcReg;
>         unsigned JoinPReg = SrcIsPhys ? SrcReg : DstReg;
> +
> +        // Don't join with physregs that have a ridiculous number of live
> +        // ranges. The data structure performance is really bad when that
> +        // happens.
> +        if (JoinPInt.ranges.size() > 1000) {
> +          mri_->setRegAllocationHint(JoinVInt.reg, 0, JoinPReg);
> +          ++numAborts;
> +          DEBUG(dbgs() << "\tPhysical register too complicated, abort!\n");
> +          return false;
> +        }
> +
>         const TargetRegisterClass *RC = mri_->getRegClass(JoinVReg);
>         unsigned Threshold = allocatableRCRegs_[RC].count() * 2;
>         unsigned Length = li_->getApproximateInstructionCount(JoinVInt);
> 
> 
> _______________________________________________
> 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