diff options
author | Carol Eidt <carol.eidt@microsoft.com> | 2017-10-27 18:59:55 -0700 |
---|---|---|
committer | Carol Eidt <carol.eidt@microsoft.com> | 2017-10-27 19:02:31 -0700 |
commit | 018abea1a3cb63ea0b9c77bccf4f22c126282bf5 (patch) | |
tree | aa66692ee02a92f24552e3f16f15449c25bd3f24 /src | |
parent | dff79fceb970f9b93f038edaa0016e4a18007b0d (diff) | |
download | coreclr-018abea1a3cb63ea0b9c77bccf4f22c126282bf5.tar.gz coreclr-018abea1a3cb63ea0b9c77bccf4f22c126282bf5.tar.bz2 coreclr-018abea1a3cb63ea0b9c77bccf4f22c126282bf5.zip |
Fix another overly agressive assert
Fix #14732
Diffstat (limited to 'src')
-rw-r--r-- | src/jit/lsra.cpp | 58 |
1 files changed, 33 insertions, 25 deletions
diff --git a/src/jit/lsra.cpp b/src/jit/lsra.cpp index b4c4bff394..2be94b98fa 100644 --- a/src/jit/lsra.cpp +++ b/src/jit/lsra.cpp @@ -6444,42 +6444,50 @@ regNumber LinearScan::allocateBusyReg(Interval* current, RefPosition* refPositio { // Must have found a spill candidate. assert(farthestRefPhysRegRecord != nullptr); - if ((farthestLocation == refLocation) && !refPosition->isFixedRegRef) + + if (farthestLocation == refLocation) { -#ifdef _TARGET_ARM_ - Interval* assignedInterval = - (farthestRefPhysRegRecord == nullptr) ? nullptr : farthestRefPhysRegRecord->assignedInterval; - Interval* assignedInterval2 = - (farthestRefPhysRegRecord2 == nullptr) ? nullptr : farthestRefPhysRegRecord2->assignedInterval; - RefPosition* nextRefPosition = - (assignedInterval == nullptr) ? nullptr : assignedInterval->getNextRefPosition(); - RefPosition* nextRefPosition2 = - (assignedInterval2 == nullptr) ? nullptr : assignedInterval2->getNextRefPosition(); - if (nextRefPosition != nullptr) + // This must be a RefPosition that is constrained to use a snigle register, either directly, + // or at the use, or by stress. + bool isConstrained = (refPosition->isFixedRegRef || + (refPosition->nextRefPosition != nullptr && refPosition->nextRefPosition->isFixedRegRef) || + candidatesAreStressLimited()); + if (!isConstrained) { - if (nextRefPosition2 != nullptr) - { - assert(!nextRefPosition->RequiresRegister() || !nextRefPosition2->RequiresRegister()); +#ifdef _TARGET_ARM_ + Interval* assignedInterval = + (farthestRefPhysRegRecord == nullptr) ? nullptr : farthestRefPhysRegRecord->assignedInterval; + Interval* assignedInterval2 = + (farthestRefPhysRegRecord2 == nullptr) ? nullptr : farthestRefPhysRegRecord2->assignedInterval; + RefPosition* nextRefPosition = + (assignedInterval == nullptr) ? nullptr : assignedInterval->getNextRefPosition(); + RefPosition* nextRefPosition2 = + (assignedInterval2 == nullptr) ? nullptr : assignedInterval2->getNextRefPosition(); + if (nextRefPosition != nullptr) + { + if (nextRefPosition2 != nullptr) + { + assert(!nextRefPosition->RequiresRegister() || !nextRefPosition2->RequiresRegister()); + } + else + { + assert(!nextRefPosition->RequiresRegister()); + } } else { - assert(!nextRefPosition->RequiresRegister()); + assert(nextRefPosition2 != nullptr && !nextRefPosition2->RequiresRegister()); } - } - else - { - assert(nextRefPosition2 != nullptr && !nextRefPosition2->RequiresRegister()); - } #else // !_TARGET_ARM_ - Interval* assignedInterval = farthestRefPhysRegRecord->assignedInterval; - RefPosition* nextRefPosition = assignedInterval->getNextRefPosition(); - assert(!nextRefPosition->RequiresRegister()); + Interval* assignedInterval = farthestRefPhysRegRecord->assignedInterval; + RefPosition* nextRefPosition = assignedInterval->getNextRefPosition(); + assert(!nextRefPosition->RequiresRegister()); #endif // !_TARGET_ARM_ + } } else { - assert(farthestLocation > refLocation || refPosition->isFixedRegRef || - (refPosition->nextRefPosition != nullptr && refPosition->nextRefPosition->isFixedRegRef)); + assert(farthestLocation > refLocation); } } #endif // DEBUG |