From fd18c7fd245844d2325b939b49bfe5f15bc93efd Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Wed, 29 May 2024 06:42:45 -0700 Subject: [PATCH] RemoveRegNumFromMask() and RemoveRegNum() and consume them --- src/coreclr/jit/lsra.cpp | 17 ++++++++--------- src/coreclr/jit/lsra.h | 7 +++---- src/coreclr/jit/regMaskTPOps.cpp | 25 +++++++++++++++++++++++++ src/coreclr/jit/target.h | 2 ++ 4 files changed, 38 insertions(+), 13 deletions(-) diff --git a/src/coreclr/jit/lsra.cpp b/src/coreclr/jit/lsra.cpp index b75934422aa80..af9ed9bc17c22 100644 --- a/src/coreclr/jit/lsra.cpp +++ b/src/coreclr/jit/lsra.cpp @@ -289,7 +289,7 @@ void LinearScan::updateNextFixedRef(RegRecord* regRecord, RefPosition* nextRefPo if (nextLocation == MaxLocation) { - fixedRegs &= ~genRegMask(regRecord->regNum); + fixedRegs.RemoveRegNumFromMask(regRecord->regNum); } else { @@ -4655,7 +4655,7 @@ void LinearScan::processBlockStartLocations(BasicBlock* currentBlock) RegRecord* anotherHalfRegRec = findAnotherHalfRegRec(targetRegRecord); // Use TYP_FLOAT to get the regmask of just the half reg. - liveRegs &= ~getRegMask(anotherHalfRegRec->regNum, TYP_FLOAT); + liveRegs.RemoveRegNum(anotherHalfRegRec->regNum, TYP_FLOAT); } #endif // TARGET_ARM @@ -9814,7 +9814,7 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, regNumber upperHalfReg = REG_NEXT(fromReg); if ((otherInterval->registerType == TYP_DOUBLE) && (location[upperHalfReg] != REG_NA)) { - targetRegsReady &= ~fromRegMask; + targetRegsReady.RemoveRegNumFromMask(fromReg); } } } @@ -9859,7 +9859,7 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, regNumber fromReg = (regNumber)location[sourceReg]; if (targetReg == fromReg) { - targetRegsToDo &= ~targetRegMask; + targetRegsToDo.RemoveRegNumFromMask(targetReg); } else { @@ -9902,8 +9902,7 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, // Otherwise, we'll spill it to the stack and reload it later. if (useSwap) { - regMaskTP fromRegMask = genRegMask(fromReg); - targetRegsToDo &= ~fromRegMask; + targetRegsToDo.RemoveRegNumFromMask(fromReg); } } else @@ -9950,7 +9949,7 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, regMaskTP otherTargetRegMask = genRegMask(otherTargetReg); targetRegsFromStack |= otherTargetRegMask; stackToRegIntervals[otherTargetReg] = otherInterval; - targetRegsToDo &= ~otherTargetRegMask; + targetRegsToDo.RemoveRegNumFromMask(otherTargetReg); // Now, move the interval that is going to targetReg. addResolution(block, insertionPoint, sourceIntervals[sourceReg], targetReg, @@ -9976,13 +9975,13 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, regNumber upperHalfReg = REG_NEXT(fromReg); if ((otherInterval->registerType == TYP_DOUBLE) && (location[upperHalfReg] != REG_NA)) { - targetRegsReady &= ~fromRegMask; + targetRegsReady.RemoveRegNumFromMask(fromReg); } } #endif // TARGET_ARM } } - targetRegsToDo &= ~targetRegMask; + targetRegsToDo.RemoveRegNumFromMask(targetReg); } else { diff --git a/src/coreclr/jit/lsra.h b/src/coreclr/jit/lsra.h index 73d7a4c98455f..eff90ad80608f 100644 --- a/src/coreclr/jit/lsra.h +++ b/src/coreclr/jit/lsra.h @@ -1824,8 +1824,7 @@ class LinearScan : public LinearScanInterface } void setRegInUse(regNumber reg, var_types regType) { - regMaskTP regMask = getRegMask(reg, regType); - setRegsInUse(regMask); + m_AvailableRegs.RemoveRegNum(reg, regType); } void makeRegsAvailable(regMaskTP regMask) { @@ -1853,7 +1852,7 @@ class LinearScan : public LinearScanInterface regMaskTP m_RegistersWithConstants; void clearConstantReg(regNumber reg, var_types regType) { - m_RegistersWithConstants &= ~getRegMask(reg, regType); + m_RegistersWithConstants.RemoveRegNum(reg, regType); } void setConstantReg(regNumber reg, var_types regType) { @@ -1913,7 +1912,7 @@ class LinearScan : public LinearScanInterface } void clearRegBusyUntilKill(regNumber reg) { - regsBusyUntilKill &= ~genRegMask(reg); + regsBusyUntilKill.RemoveRegNumFromMask(reg); } bool isRegInUse(regNumber reg, var_types regType) diff --git a/src/coreclr/jit/regMaskTPOps.cpp b/src/coreclr/jit/regMaskTPOps.cpp index f2e5f73f5280c..2bbd4918b571a 100644 --- a/src/coreclr/jit/regMaskTPOps.cpp +++ b/src/coreclr/jit/regMaskTPOps.cpp @@ -58,6 +58,15 @@ void regMaskTP::AddRegNumInMask(regNumber reg, var_types type) { low |= genSingleTypeRegMask(reg, type); } + +// ---------------------------------------------------------- +// RemoveRegNumFromMask: Removes `reg` from the mask. It is same as RemoveRegNumFromMask(reg) except +// that it takes `type` as an argument and adds `reg` to the mask for that type. +// +void regMaskTP::RemoveRegNumFromMask(regNumber reg, var_types type) +{ + low &= ~genSingleTypeRegMask(reg, type); +} #endif // This is similar to AddRegNumInMask(reg, regType) for all platforms @@ -89,6 +98,22 @@ void regMaskTP::RemoveRegNumFromMask(regNumber reg) #endif } +//------------------------------------------------------------------------ +// RemoveRegNum: his is similar to RemoveRegNumFromMask(reg, regType) for all platforms +// except Arm. For Arm, it calls getRegMask() instead of genRegMask() +// to create a mask that needs to be added. +// Parameters: +// reg - Register to remove +// +void regMaskTP::RemoveRegNum(regNumber reg, var_types type) +{ +#ifdef TARGET_ARM + low &= ~getRegMask(reg, type); +#else + RemoveRegNumFromMask(reg); +#endif +} + //------------------------------------------------------------------------ // IsRegNumInMask: Checks if `reg` is in the mask // diff --git a/src/coreclr/jit/target.h b/src/coreclr/jit/target.h index 6bac64fe648a1..ab08d63e28fbe 100644 --- a/src/coreclr/jit/target.h +++ b/src/coreclr/jit/target.h @@ -278,9 +278,11 @@ struct regMaskTP void AddRegNumInMask(regNumber reg); #ifdef TARGET_ARM void AddRegNumInMask(regNumber reg, var_types type); + void RemoveRegNumFromMask(regNumber reg, var_types type); #endif void AddRegNum(regNumber reg, var_types type); void RemoveRegNumFromMask(regNumber reg); + void RemoveRegNum(regNumber reg, var_types type); bool IsRegNumInMask(regNumber reg); regMaskTP(regMaskSmall lowMask, RegSet32 highMask)