JIT: don't overlook strong nearby preference in LSRA (#16028)
authorAndy Ayers <andya@microsoft.com>
Mon, 29 Jan 2018 20:36:38 +0000 (12:36 -0800)
committerGitHub <noreply@github.com>
Mon, 29 Jan 2018 20:36:38 +0000 (12:36 -0800)
When allocating an interval, LSRA will look at related intervals
for preference hints.

LSRA may look past a related interval I1 to its related interval
I2 if I1 looks like a simple copy. But if I1 has been previously
allocated then it seems we are often better served using I1's
preferences instead of using I2's.

Addresses some issues seen in #11390.

src/jit/lsra.cpp

index b6c8b96..483d8dd 100644 (file)
@@ -5308,8 +5308,8 @@ regNumber LinearScan::tryAllocateFreeReg(Interval* currentInterval, RefPosition*
             {
                 relatedInterval = nullptr;
             }
-            // Is the relatedInterval simply a copy to another relatedInterval?
-            else if ((relatedInterval->relatedInterval != nullptr) &&
+            // Is the relatedInterval not assigned and simply a copy to another relatedInterval?
+            else if ((relatedInterval->assignedReg == nullptr) && (relatedInterval->relatedInterval != nullptr) &&
                      (nextRelatedRefPosition->nextRefPosition != nullptr) &&
                      (nextRelatedRefPosition->nextRefPosition->nextRefPosition == nullptr) &&
                      (nextRelatedRefPosition->nextRefPosition->nodeLocation <