summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarol Eidt <carol.eidt@microsoft.com>2017-10-27 18:59:55 -0700
committerCarol Eidt <carol.eidt@microsoft.com>2017-10-27 19:02:31 -0700
commit018abea1a3cb63ea0b9c77bccf4f22c126282bf5 (patch)
treeaa66692ee02a92f24552e3f16f15449c25bd3f24 /src
parentdff79fceb970f9b93f038edaa0016e4a18007b0d (diff)
downloadcoreclr-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.cpp58
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