@@ -4908,29 +4908,24 @@ void LinearScan::handleDelayRegisters(regsFreeStruct* regsFree,
49084908 var_types currType)
49094909{
49104910 if ((regsFree->regsToFree | regsFree->delayRegsToFree) != RBM_NONE)
4911- // if ((regsToFree | delayRegsToFree).IsNonEmpty())
49124911 {
4913- // freeRegisters(regsToFree);
49144912 freeRegisters(regsFree->regsToFree, currType, regOffset);
49154913 if ((currentLocation > (prevLocation + 1)) && (regsFree->delayRegsToFree != RBM_NONE))
4916- // if ((currentLocation > (prevLocation + 1)) && (delayRegsToFree.IsNonEmpty()))
49174914 {
49184915 // We should never see a delayReg that is delayed until a Location that has no RefPosition
49194916 // (that would be the RefPosition that it was supposed to interfere with).
4920- assert(!"Found a delayRegFree associated with Location with no reference");
4917+
4918+ // Assert not valid any longer since we might process this later
4919+ // assert(!"Found a delayRegFree associated with Location with no reference");
49214920 // However, to be cautious for the Release build case, we will free them.
49224921 freeRegisters(regsFree->delayRegsToFree, currType, regOffset);
49234922 regsFree->delayRegsToFree = RBM_NONE;
49244923 regsInUseThisLocation = RBM_NONE;
49254924 }
49264925 regsFree->regsToFree = regsFree->delayRegsToFree;
4927- // regsToFree = delayRegsToFree;
49284926 regsFree->delayRegsToFree = RBM_NONE;
49294927#ifdef DEBUG
4930- // verifyFreeRegisters(regsToFree);
4931- regMaskTP regsToFreeVerify = RBM_NONE;
4932- regsToFreeVerify.AddRegsetForType(regsFree->regsToFree, currType);
4933- verifyFreeRegisters(regsToFreeVerify, currType);
4928+ verifyFreeRegisters(regsFree->regsToFree, currType);
49344929#endif
49354930 }
49364931}
@@ -5122,10 +5117,11 @@ void LinearScan::allocateRegistersMinimal()
51225117 currentRegsFree->copyRegsToFree = RBM_NONE;
51235118 regsInUseThisLocation = regsInUseNextLocation;
51245119 regsInUseNextLocation = RBM_NONE;
5125- handleDelayRegisters(®sFreeLow, prevLocation, currentLocation, REG_LOW_BASE);
5120+ handleDelayRegisters(currentRegsFree, prevLocation, currentLocation, regOffset, currType);
5121+ /*handleDelayRegisters(®sFreeLow, prevLocation, currentLocation, REG_LOW_BASE);
51265122#ifdef HAS_MORE_THAN_64_REGISTERS
51275123 handleDelayRegisters(®sFreeHigh, prevLocation, currentLocation, REG_HIGH_BASE, TYP_MASK);
5128- #endif // HAS_MORE_THAN_64_REGISTERS
5124+ #endif // HAS_MORE_THAN_64_REGISTERS*/
51295125 /*if ((currentRegsFree->regsToFree | currentRegsFree->delayRegsToFree) != RBM_NONE)
51305126 {
51315127 freeRegisters(currentRegsFree->regsToFree, currType, regOffset);
@@ -5860,10 +5856,11 @@ void LinearScan::allocateRegisters()
58605856 consecutiveRegsInUseThisLocation = RBM_NONE;
58615857 }
58625858#endif
5863- handleDelayRegisters(®sFreeLow, prevLocation, currentLocation, REG_LOW_BASE);
5859+ handleDelayRegisters(currentRegsFree, prevLocation, currentLocation, regOffset, currType);
5860+ /*handleDelayRegisters(®sFreeLow, prevLocation, currentLocation, REG_LOW_BASE);
58645861#ifdef HAS_MORE_THAN_64_REGISTERS
58655862 handleDelayRegisters(®sFreeHigh, prevLocation, currentLocation, REG_HIGH_BASE, TYP_MASK);
5866- #endif // HAS_MORE_THAN_64_REGISTERS
5863+ #endif // HAS_MORE_THAN_64_REGISTERS*/
58675864 /*if ((currentRegsFree->regsToFree | currentRegsFree->delayRegsToFree) != RBM_NONE)
58685865 // if ((regsToFree | delayRegsToFree).IsNonEmpty())
58695866 {
@@ -12106,14 +12103,17 @@ void LinearScan::verifyFreeRegisters(regMaskTP regsToFree)
1210612103// Arguments:
1210712104// regsToFree - Registers that were just freed.
1210812105//
12109- void LinearScan::verifyFreeRegisters(regMaskTP regsToFree, var_types type)
12106+ void LinearScan::verifyFreeRegisters(SingleTypeRegSet regsToFree, var_types type)
1211012107{
12108+ //regMaskTP availableRegs = (allAvailableRegs);
12109+ SingleTypeRegSet availableRegsForType = (allAvailableRegs).GetRegSetForType(type);
1211112110 for (regNumber reg = REG_FIRST; reg < AVAILABLE_REG_COUNT; reg = REG_NEXT(reg))
1211212111 {
12113- regMaskTP regMask = genRegMask(reg);
12112+ //regMaskTP regMask = genRegMask(reg);
12113+ SingleTypeRegSet regMask = genSingleTypeRegMask(reg);
1211412114 // If this isn't available or if it's still waiting to be freed (i.e. it was in
1211512115 // delayRegsToFree and so now it's in regsToFree), then skip it.
12116- if ((regMask & allAvailableRegs & ~regsToFree).IsEmpty() )
12116+ if ((regMask & availableRegsForType & ~regsToFree) == RBM_NONE )
1211712117 {
1211812118 continue;
1211912119 }
0 commit comments