Skip to content

Commit 1d0f492

Browse files
committed
IsRegNumInMask() and IsRegNumPresent()
1 parent f370cf1 commit 1d0f492

File tree

4 files changed

+57
-39
lines changed

4 files changed

+57
-39
lines changed

src/coreclr/jit/lsra.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4682,7 +4682,7 @@ void LinearScan::processBlockStartLocations(BasicBlock* currentBlock)
46824682
for (regNumber reg = REG_FIRST; reg < AVAILABLE_REG_COUNT; reg = REG_NEXT(reg))
46834683
{
46844684
RegRecord* physRegRecord = getRegisterRecord(reg);
4685-
if ((liveRegs & genRegMask(reg)) == 0)
4685+
if (liveRegs.IsRegNumInMask(reg))
46864686
{
46874687
makeRegAvailable(reg, physRegRecord->registerType);
46884688
Interval* assignedInterval = physRegRecord->assignedInterval;
@@ -9167,14 +9167,15 @@ void LinearScan::handleOutgoingCriticalEdges(BasicBlock* block)
91679167
// We only need to check for these cases if sameToReg is an actual register (not REG_STK).
91689168
if (sameToReg != REG_NA && sameToReg != REG_STK)
91699169
{
9170+
var_types outVarRegType = getIntervalForLocalVar(outResolutionSetVarIndex)->registerType;
9171+
91709172
// If there's a path on which this var isn't live, it may use the original value in sameToReg.
91719173
// In this case, sameToReg will be in the liveOutRegs of this block.
91729174
// Similarly, if sameToReg is in sameWriteRegs, it has already been used (i.e. for a lclVar that's
91739175
// live only at another target), and we can't copy another lclVar into that reg in this block.
91749176
regMaskTP sameToRegMask =
91759177
genRegMask(sameToReg, getIntervalForLocalVar(outResolutionSetVarIndex)->registerType);
9176-
if (maybeSameLivePaths &&
9177-
(((sameToRegMask & liveOutRegs).IsNonEmpty()) || ((sameToRegMask & sameWriteRegs).IsNonEmpty())))
9178+
if (maybeSameLivePaths && (liveOutRegs.IsRegNumInMask(sameToReg ARM_ARG(outVarRegType)) || sameWriteRegs.IsRegNumInMask(sameToReg ARM_ARG(outVarRegType))))
91789179
{
91799180
sameToReg = REG_NA;
91809181
}
@@ -9796,14 +9797,13 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock,
97969797
fromReg DEBUG_ARG(fromBlock) DEBUG_ARG(toBlock) DEBUG_ARG(resolveTypeName[resolveType]));
97979798
sourceIntervals[sourceReg] = nullptr;
97989799
location[sourceReg] = REG_NA;
9799-
regMaskTP fromRegMask = genRegMask(fromReg);
98009800

98019801
// Do we have a free targetReg?
98029802
if (fromReg == sourceReg)
98039803
{
9804-
if (source[fromReg] != REG_NA && ((targetRegsFromStack & fromRegMask) != fromRegMask))
9804+
if (source[fromReg] != REG_NA && (targetRegsFromStack.IsRegNumInMask(fromReg)))
98059805
{
9806-
targetRegsReady |= fromRegMask;
9806+
targetRegsReady |= fromReg;
98079807
#ifdef TARGET_ARM
98089808
if (genIsValidDoubleReg(fromReg))
98099809
{
@@ -9836,13 +9836,13 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock,
98369836
// lowerHalfRegMask)
98379837
if ((lowerHalfSrcReg != REG_NA) && (lowerHalfSrcLoc == REG_NA) &&
98389838
(sourceIntervals[lowerHalfSrcReg] != nullptr) &&
9839-
((targetRegsReady & lowerHalfRegMask) == RBM_NONE) &&
9840-
((targetRegsFromStack & lowerHalfRegMask) != lowerHalfRegMask))
9839+
!targetRegsReady.IsRegNumInMask(lowerHalfReg) &&
9840+
!targetRegsFromStack.IsRegNumInMask(lowerHalfReg))
98419841
{
98429842
// This must be a double interval, otherwise it would be in targetRegsReady, or already
98439843
// completed.
98449844
assert(sourceIntervals[lowerHalfSrcReg]->registerType == TYP_DOUBLE);
9845-
targetRegsReady |= lowerHalfRegMask;
9845+
targetRegsReady |= lowerHalfReg;
98469846
}
98479847
#endif // TARGET_ARM
98489848
}
@@ -11445,7 +11445,7 @@ void LinearScan::dumpRegRecordTitleIfNeeded()
1144511445
int lastRegNumIndex = compiler->compFloatingPointUsed ? REG_FP_LAST : REG_INT_LAST;
1144611446
for (int regNumIndex = 0; regNumIndex <= lastRegNumIndex; regNumIndex++)
1144711447
{
11448-
if ((registersToDump & genRegMask((regNumber)regNumIndex)) != 0)
11448+
if (registersToDump.IsRegNumInMask((regNumber)regNumIndex))
1144911449
{
1145011450
lastUsedRegNumIndex = regNumIndex;
1145111451
}
@@ -11525,7 +11525,7 @@ void LinearScan::dumpRegRecords()
1152511525
#endif // FEATURE_PARTIAL_SIMD_CALLEE_SAVE
1152611526
printf("%c", activeChar);
1152711527
}
11528-
else if ((genRegMask(regNum) & regsBusyUntilKill).IsNonEmpty())
11528+
else if (regsBusyUntilKill.IsRegNumInMask(regNum))
1152911529
{
1153011530
printf(columnFormatArray, "Busy");
1153111531
}

src/coreclr/jit/lsra.h

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1500,7 +1500,7 @@ class LinearScan : public LinearScanInterface
15001500
int lastUsedRegNumIndex;
15011501
bool shouldDumpReg(regNumber regNum)
15021502
{
1503-
return (registersToDump & genRegMask(regNum)) != 0;
1503+
return registersToDump.IsRegNumInMask(regNum);
15041504
}
15051505

15061506
void dumpRegRecordHeader();
@@ -1815,8 +1815,7 @@ class LinearScan : public LinearScanInterface
18151815

18161816
bool isRegAvailable(regNumber reg, var_types regType)
18171817
{
1818-
regMaskTP regMask = getRegMask(reg, regType);
1819-
return (m_AvailableRegs & regMask) == regMask;
1818+
return m_AvailableRegs.IsRegNumPresent(reg, regType);
18201819
}
18211820
void setRegsInUse(regMaskTP regMask)
18221821
{
@@ -1860,9 +1859,7 @@ class LinearScan : public LinearScanInterface
18601859
}
18611860
bool isRegConstant(regNumber reg, var_types regType)
18621861
{
1863-
reg = getRegForType(reg, regType);
1864-
regMaskTP regMask = getRegMask(reg, regType);
1865-
return (m_RegistersWithConstants & regMask) == regMask;
1862+
return m_RegistersWithConstants.IsRegNumPresent(reg, regType);
18661863
}
18671864
SingleTypeRegSet getMatchingConstants(SingleTypeRegSet mask, Interval* currentInterval, RefPosition* refPosition);
18681865

@@ -1903,8 +1900,7 @@ class LinearScan : public LinearScanInterface
19031900
#endif
19041901
bool isRegBusy(regNumber reg, var_types regType)
19051902
{
1906-
regMaskTP regMask = getRegMask(reg, regType);
1907-
return (regsBusyUntilKill & regMask) != RBM_NONE;
1903+
return regsBusyUntilKill.IsRegNumPresent(reg, regType);
19081904
}
19091905
void setRegBusyUntilKill(regNumber reg, var_types regType)
19101906
{
@@ -1917,8 +1913,7 @@ class LinearScan : public LinearScanInterface
19171913

19181914
bool isRegInUse(regNumber reg, var_types regType)
19191915
{
1920-
regMaskTP regMask = getRegMask(reg, regType);
1921-
return (regsInUseThisLocation & regMask) != RBM_NONE;
1916+
return regsInUseThisLocation.IsRegNumPresent(reg, regType);
19221917
}
19231918

19241919
void resetRegState()

src/coreclr/jit/regMaskTPOps.cpp

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,15 @@ void regMaskTP::RemoveRegNumFromMask(regNumber reg, var_types type)
6767
{
6868
low &= ~genSingleTypeRegMask(reg, type);
6969
}
70+
71+
// ----------------------------------------------------------
72+
// IsRegNumInMask: Removes `reg` from the mask. It is same as IsRegNumInMask(reg) except
73+
// that it takes `type` as an argument and adds `reg` to the mask for that type.
74+
//
75+
bool regMaskTP::IsRegNumInMask(regNumber reg, var_types type) const
76+
{
77+
return (low & genSingleTypeRegMask(reg, type)) != RBM_NONE;
78+
}
7079
#endif
7180

7281
// This is similar to AddRegNumInMask(reg, regType) for all platforms
@@ -81,6 +90,35 @@ void regMaskTP::AddRegNum(regNumber reg, var_types type)
8190
#endif
8291
}
8392

93+
//------------------------------------------------------------------------
94+
// IsRegNumInMask: Checks if `reg` is in the mask
95+
//
96+
// Parameters:
97+
// reg - Register to check
98+
//
99+
bool regMaskTP::IsRegNumInMask(regNumber reg) const
100+
{
101+
SingleTypeRegSet value = genSingleTypeRegMask(reg);
102+
#ifdef HAS_MORE_THAN_64_REGISTERS
103+
int index = getRegisterTypeIndex(reg);
104+
return (_registers[index] & encodeForRegisterIndex(index, value)) != RBM_NONE;
105+
#else
106+
return (low & value) != RBM_NONE;
107+
#endif
108+
}
109+
110+
// This is similar to IsRegNumInMask(reg, regType) for all platforms
111+
// except Arm. For Arm, it calls getRegMask() instead of genRegMask()
112+
// to create a mask that needs to be added.
113+
bool regMaskTP::IsRegNumPresent(regNumber reg, var_types type) const
114+
{
115+
#ifdef TARGET_ARM
116+
return (low & getRegMask(reg, type)) != RBM_NONE;
117+
#else
118+
return IsRegNumInMask(reg);
119+
#endif
120+
}
121+
84122
//------------------------------------------------------------------------
85123
// RemoveRegNumFromMask: Removes `reg` from the mask
86124
//
@@ -114,23 +152,6 @@ void regMaskTP::RemoveRegNum(regNumber reg, var_types type)
114152
#endif
115153
}
116154

117-
//------------------------------------------------------------------------
118-
// IsRegNumInMask: Checks if `reg` is in the mask
119-
//
120-
// Parameters:
121-
// reg - Register to check
122-
//
123-
bool regMaskTP::IsRegNumInMask(regNumber reg)
124-
{
125-
SingleTypeRegSet value = genSingleTypeRegMask(reg);
126-
#ifdef HAS_MORE_THAN_64_REGISTERS
127-
int index = getRegisterTypeIndex(reg);
128-
return (_registers[index] & encodeForRegisterIndex(index, value)) != RBM_NONE;
129-
#else
130-
return (low & value) != RBM_NONE;
131-
#endif
132-
}
133-
134155
/* static */ int regMaskTP::getRegisterTypeIndex(regNumber reg)
135156
{
136157
static const BYTE _registerTypeIndex[] = {

src/coreclr/jit/target.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,11 +279,13 @@ struct regMaskTP
279279
#ifdef TARGET_ARM
280280
void AddRegNumInMask(regNumber reg, var_types type);
281281
void RemoveRegNumFromMask(regNumber reg, var_types type);
282+
bool IsRegNumInMask(regNumber reg, var_types type) const;
282283
#endif
283284
void AddRegNum(regNumber reg, var_types type);
284285
void RemoveRegNumFromMask(regNumber reg);
285286
void RemoveRegNum(regNumber reg, var_types type);
286-
bool IsRegNumInMask(regNumber reg);
287+
bool IsRegNumInMask(regNumber reg) const;
288+
bool IsRegNumPresent(regNumber reg, var_types type) const;
287289

288290
regMaskTP(regMaskSmall lowMask, RegSet32 highMask)
289291
: low(lowMask)

0 commit comments

Comments
 (0)