mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-08 21:32:39 +00:00
Add a limit to the heuristic that register allocates instructions in local order.
This handles pathological cases in which we see 2x increase in spill code for large blocks (~50k instructions). I don't have a unit test for this behavior. Fixes rdar://16072279. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202304 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
692c94c1c9
commit
eaf8a32859
@ -454,12 +454,18 @@ void RAGreedy::enqueue(PQueue &CurQueue, LiveInterval *LI) {
|
||||
// everything else has been allocated.
|
||||
Prio = Size;
|
||||
} else {
|
||||
if (ExtraRegInfo[Reg].Stage == RS_Assign && !LI->empty() &&
|
||||
// Giant live ranges fall back to the global assignment heuristic, which
|
||||
// prevents excessive spilling in pathological cases.
|
||||
bool ReverseLocal = TRI->reverseLocalAssignment();
|
||||
bool ForceGlobal = !ReverseLocal &&
|
||||
(Size / SlotIndex::InstrDist) > (2 * MRI->getRegClass(Reg)->getNumRegs());
|
||||
|
||||
if (ExtraRegInfo[Reg].Stage == RS_Assign && !ForceGlobal && !LI->empty() &&
|
||||
LIS->intervalIsInOneMBB(*LI)) {
|
||||
// Allocate original local ranges in linear instruction order. Since they
|
||||
// are singly defined, this produces optimal coloring in the absence of
|
||||
// global interference and other constraints.
|
||||
if (!TRI->reverseLocalAssignment())
|
||||
if (!ReverseLocal)
|
||||
Prio = LI->beginIndex().getInstrDistance(Indexes->getLastIndex());
|
||||
else {
|
||||
// Allocating bottom up may allow many short LRGs to be assigned first
|
||||
|
@ -10,7 +10,7 @@
|
||||
; more complex cases.
|
||||
;
|
||||
; CHECK: @wrap_mul4
|
||||
; CHECK: 23 regalloc - Number of spills inserted
|
||||
; CHECK: 22 regalloc - Number of spills inserted
|
||||
|
||||
define void @wrap_mul4(double* nocapture %Out, [4 x double]* nocapture %A, [4 x double]* nocapture %B) #0 {
|
||||
entry:
|
||||
|
Loading…
x
Reference in New Issue
Block a user