Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Handle more than 64 registers - Part 3 #102592

Merged
merged 44 commits into from
May 24, 2024
Merged
Changes from 1 commit
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
cec9ad9
Add `high` in regMaskTP
kunalspathak May 15, 2024
5fa863e
Introduce SingleTypeRegSet
kunalspathak May 15, 2024
7dba61b
Use SingleTypeRegSet in few places
kunalspathak May 15, 2024
f68cf05
Delete some methods in regMaskTP
kunalspathak May 15, 2024
7f8a9b6
Delete some more methods of regMaskTP
kunalspathak May 15, 2024
2ede666
Fix actualRegistersMask
kunalspathak May 15, 2024
4b873d4
Use SingleTypeRegSet in consecutive register code
kunalspathak May 15, 2024
98caccf
Use SingleTypeRegSet in consecutive registers codebase
kunalspathak May 15, 2024
dbb72eb
Change genRegMask*() method to return SingleTypeRegSet
kunalspathak May 15, 2024
36d5919
wip
kunalspathak May 15, 2024
a647a65
another wip
kunalspathak May 16, 2024
9a15670
Everything except newRefPosition/killMask
kunalspathak May 16, 2024
5e739a4
refactor code around buildkill
kunalspathak May 20, 2024
e93f528
fix build errors
kunalspathak May 20, 2024
05b09b2
some more errors
kunalspathak May 20, 2024
f00f7a8
jit format
kunalspathak May 20, 2024
d356c89
Merge remote-tracking branch 'kp/lsra-refactor' into more-than-64-par…
kunalspathak May 20, 2024
06bd9e2
fixed build error for arm64
kunalspathak May 20, 2024
325bc6e
REVERT: temporary add #ifdef TARGET_ARM64 for accessing regMaskTP met…
kunalspathak May 20, 2024
92378d5
Merge remote-tracking branch 'origin/main' into more-than-64-part2-kill
kunalspathak May 21, 2024
e96428f
forgot to add the new file
kunalspathak May 21, 2024
1cf6b7a
make addRegsForKill only on low
kunalspathak May 21, 2024
bf86515
jit format
kunalspathak May 21, 2024
2065ba3
Merge remote-tracking branch 'origin/main' into more-than-64-part2-kill
kunalspathak May 22, 2024
7d566b4
Revert "REVERT: temporary add #ifdef TARGET_ARM64 for accessing regMa…
kunalspathak May 22, 2024
1963c98
Various fixes after merge
kunalspathak May 22, 2024
31498ef
passing arm64 build
kunalspathak May 22, 2024
f17257d
clrjit build works
kunalspathak May 22, 2024
a85312d
clrjit_universal_arm_x64 build works
kunalspathak May 23, 2024
d7c1010
clrjit_unix_x64_x64 build works
kunalspathak May 23, 2024
ba4ef0d
clrjit_win_x86_x64 build works
kunalspathak May 23, 2024
1868424
fix a bug in size
kunalspathak May 23, 2024
384fef8
delete unwanted method
kunalspathak May 23, 2024
b9181bc
Merge remote-tracking branch 'origin/main' into more-than-64-part2
kunalspathak May 23, 2024
f0ef2bc
jit format
kunalspathak May 23, 2024
db03c23
Remove high
kunalspathak May 23, 2024
d094109
Continue using regMaskTP for NodeInternalRegisters
kunalspathak May 23, 2024
ca77f79
Pass regType to getConstrainedRegMask()
kunalspathak May 23, 2024
e0b87d4
jit format
kunalspathak May 23, 2024
5b65ddc
fix a wrong parameter for consecutive register
kunalspathak May 24, 2024
494d862
fix riscv64 build errors
kunalspathak May 24, 2024
baecc25
Merge remote-tracking branch 'origin/main' into more-than-64-part2
kunalspathak May 24, 2024
aabb072
Merge remote-tracking branch 'kp/more-than-64-part2' into more-than-6…
kunalspathak May 24, 2024
eb4515d
jit format
kunalspathak May 24, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
clrjit build works
kunalspathak committed May 22, 2024
commit f17257dbb1714aafa53805ed66edc778061f246d
16 changes: 8 additions & 8 deletions src/coreclr/jit/codegeninterface.h
Original file line number Diff line number Diff line change
@@ -75,31 +75,31 @@ class CodeGenInterface
}

#if defined(TARGET_AMD64)
regMaskTP rbmAllFloat;
regMaskTP rbmFltCalleeTrash;
SingleTypeRegSet rbmAllFloat;
SingleTypeRegSet rbmFltCalleeTrash;

FORCEINLINE regMaskTP get_RBM_ALLFLOAT() const
FORCEINLINE SingleTypeRegSet get_RBM_ALLFLOAT() const
{
return this->rbmAllFloat;
}
FORCEINLINE regMaskTP get_RBM_FLT_CALLEE_TRASH() const
FORCEINLINE SingleTypeRegSet get_RBM_FLT_CALLEE_TRASH() const
{
return this->rbmFltCalleeTrash;
}
#endif // TARGET_AMD64

#if defined(TARGET_XARCH)
regMaskTP rbmAllMask;
regMaskTP rbmMskCalleeTrash;
SingleTypeRegSet rbmAllMask;
SingleTypeRegSet rbmMskCalleeTrash;

// Call this function after the equivalent fields in Compiler have been initialized.
void CopyRegisterInfo();

FORCEINLINE regMaskTP get_RBM_ALLMASK() const
FORCEINLINE SingleTypeRegSet get_RBM_ALLMASK() const
{
return this->rbmAllMask;
}
FORCEINLINE regMaskTP get_RBM_MSK_CALLEE_TRASH() const
FORCEINLINE SingleTypeRegSet get_RBM_MSK_CALLEE_TRASH() const
{
return this->rbmMskCalleeTrash;
}
24 changes: 12 additions & 12 deletions src/coreclr/jit/compiler.h
Original file line number Diff line number Diff line change
@@ -11246,8 +11246,8 @@ class Compiler
//
// Users of these values need to define four accessor functions:
//
// regMaskTP get_RBM_ALLFLOAT();
// regMaskTP get_RBM_FLT_CALLEE_TRASH();
// SingleTypeRegSet get_RBM_ALLFLOAT();
// SingleTypeRegSet get_RBM_FLT_CALLEE_TRASH();
// unsigned get_CNT_CALLEE_TRASH_FLOAT();
// unsigned get_AVAILABLE_REG_COUNT();
//
@@ -11256,16 +11256,16 @@ class Compiler
// This was done to avoid polluting all `targetXXX.h` macro definitions with a compiler parameter, where only
// TARGET_AMD64 requires one.
//
regMaskTP rbmAllFloat;
regMaskTP rbmFltCalleeTrash;
SingleTypeRegSet rbmAllFloat;
SingleTypeRegSet rbmFltCalleeTrash;
unsigned cntCalleeTrashFloat;

public:
FORCEINLINE regMaskTP get_RBM_ALLFLOAT() const
FORCEINLINE SingleTypeRegSet get_RBM_ALLFLOAT() const
{
return this->rbmAllFloat;
}
FORCEINLINE regMaskTP get_RBM_FLT_CALLEE_TRASH() const
FORCEINLINE SingleTypeRegSet get_RBM_FLT_CALLEE_TRASH() const
{
return this->rbmFltCalleeTrash;
}
@@ -11284,8 +11284,8 @@ class Compiler
//
// Users of these values need to define four accessor functions:
//
// regMaskTP get_RBM_ALLMASK();
// regMaskTP get_RBM_MSK_CALLEE_TRASH();
// SingleTypeRegSet get_RBM_ALLMASK();
// SingleTypeRegSet get_RBM_MSK_CALLEE_TRASH();
// unsigned get_CNT_CALLEE_TRASH_MASK();
// unsigned get_AVAILABLE_REG_COUNT();
//
@@ -11294,17 +11294,17 @@ class Compiler
// This was done to avoid polluting all `targetXXX.h` macro definitions with a compiler parameter, where only
// TARGET_XARCH requires one.
//
regMaskTP rbmAllMask;
regMaskTP rbmMskCalleeTrash;
SingleTypeRegSet rbmAllMask;
SingleTypeRegSet rbmMskCalleeTrash;
unsigned cntCalleeTrashMask;
regMaskTP varTypeCalleeTrashRegs[TYP_COUNT];

public:
FORCEINLINE regMaskTP get_RBM_ALLMASK() const
FORCEINLINE SingleTypeRegSet get_RBM_ALLMASK() const
{
return this->rbmAllMask;
}
FORCEINLINE regMaskTP get_RBM_MSK_CALLEE_TRASH() const
FORCEINLINE SingleTypeRegSet get_RBM_MSK_CALLEE_TRASH() const
{
return this->rbmMskCalleeTrash;
}
28 changes: 15 additions & 13 deletions src/coreclr/jit/lsra.cpp
Original file line number Diff line number Diff line change
@@ -519,32 +519,34 @@ SingleTypeRegSet LinearScan::getConstrainedRegMask(RefPosition* refPosition,
#if defined(TARGET_AMD64)
#ifdef UNIX_AMD64_ABI
// On System V the RDI and RSI are not callee saved. Use R12 ans R13 as callee saved registers.
static const regMaskTP LsraLimitSmallIntSet = (RBM_EAX | RBM_ECX | RBM_EBX | RBM_ETW_FRAMED_EBP | RBM_R12 | RBM_R13);
static const SingleTypeRegSet LsraLimitSmallIntSet =
(RBM_EAX | RBM_ECX | RBM_EBX | RBM_ETW_FRAMED_EBP | RBM_R12 | RBM_R13);
#else // !UNIX_AMD64_ABI
// On Windows Amd64 use the RDI and RSI as callee saved registers.
static const regMaskTP LsraLimitSmallIntSet = (RBM_EAX | RBM_ECX | RBM_EBX | RBM_ETW_FRAMED_EBP | RBM_ESI | RBM_EDI);
static const SingleTypeRegSet LsraLimitSmallIntSet =
(RBM_EAX | RBM_ECX | RBM_EBX | RBM_ETW_FRAMED_EBP | RBM_ESI | RBM_EDI);
#endif // !UNIX_AMD64_ABI
static const regMaskTP LsraLimitSmallFPSet = (RBM_XMM0 | RBM_XMM1 | RBM_XMM2 | RBM_XMM6 | RBM_XMM7);
static const regMaskTP LsraLimitUpperSimdSet =
static const SingleTypeRegSet LsraLimitSmallFPSet = (RBM_XMM0 | RBM_XMM1 | RBM_XMM2 | RBM_XMM6 | RBM_XMM7);
static const SingleTypeRegSet LsraLimitUpperSimdSet =
(RBM_XMM16 | RBM_XMM17 | RBM_XMM18 | RBM_XMM19 | RBM_XMM20 | RBM_XMM21 | RBM_XMM22 | RBM_XMM23 | RBM_XMM24 |
RBM_XMM25 | RBM_XMM26 | RBM_XMM27 | RBM_XMM28 | RBM_XMM29 | RBM_XMM30 | RBM_XMM31);
#elif defined(TARGET_ARM)
// On ARM, we may need two registers to set up the target register for a virtual call, so we need
// to have at least the maximum number of arg registers, plus 2.
static const regMaskTP LsraLimitSmallIntSet = (RBM_R0 | RBM_R1 | RBM_R2 | RBM_R3 | RBM_R4 | RBM_R5);
static const regMaskTP LsraLimitSmallFPSet = (RBM_F0 | RBM_F1 | RBM_F2 | RBM_F16 | RBM_F17);
static const SingleTypeRegSet LsraLimitSmallIntSet = (RBM_R0 | RBM_R1 | RBM_R2 | RBM_R3 | RBM_R4 | RBM_R5);
static const SingleTypeRegSet LsraLimitSmallFPSet = (RBM_F0 | RBM_F1 | RBM_F2 | RBM_F16 | RBM_F17);
#elif defined(TARGET_ARM64)
static const SingleTypeRegSet LsraLimitSmallIntSet = (RBM_R0 | RBM_R1 | RBM_R2 | RBM_R19 | RBM_R20);
static const SingleTypeRegSet LsraLimitSmallFPSet = (RBM_V0 | RBM_V1 | RBM_V2 | RBM_V8 | RBM_V9);
#elif defined(TARGET_X86)
static const regMaskTP LsraLimitSmallIntSet = (RBM_EAX | RBM_ECX | RBM_EDI);
static const regMaskTP LsraLimitSmallFPSet = (RBM_XMM0 | RBM_XMM1 | RBM_XMM2 | RBM_XMM6 | RBM_XMM7);
static const SingleTypeRegSet LsraLimitSmallIntSet = (RBM_EAX | RBM_ECX | RBM_EDI);
static const SingleTypeRegSet LsraLimitSmallFPSet = (RBM_XMM0 | RBM_XMM1 | RBM_XMM2 | RBM_XMM6 | RBM_XMM7);
#elif defined(TARGET_LOONGARCH64)
static const regMaskTP LsraLimitSmallIntSet = (RBM_T1 | RBM_T3 | RBM_A0 | RBM_A1 | RBM_T0);
static const regMaskTP LsraLimitSmallFPSet = (RBM_F0 | RBM_F1 | RBM_F2 | RBM_F8 | RBM_F9);
static const SingleTypeRegSet LsraLimitSmallIntSet = (RBM_T1 | RBM_T3 | RBM_A0 | RBM_A1 | RBM_T0);
static const SingleTypeRegSet LsraLimitSmallFPSet = (RBM_F0 | RBM_F1 | RBM_F2 | RBM_F8 | RBM_F9);
#elif defined(TARGET_RISCV64)
static const regMaskTP LsraLimitSmallIntSet = (RBM_T1 | RBM_T3 | RBM_A0 | RBM_A1 | RBM_T0);
static const regMaskTP LsraLimitSmallFPSet = (RBM_F0 | RBM_F1 | RBM_F2 | RBM_F8 | RBM_F9);
static const SingleTypeRegSet LsraLimitSmallIntSet = (RBM_T1 | RBM_T3 | RBM_A0 | RBM_A1 | RBM_T0);
static const SingleTypeRegSet LsraLimitSmallFPSet = (RBM_F0 | RBM_F1 | RBM_F2 | RBM_F8 | RBM_F9);
#else
#error Unsupported or unset target architecture
#endif // target
@@ -837,7 +839,7 @@ LinearScan::LinearScan(Compiler* theCompiler)
#elif defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64)
availableIntRegs = (RBM_ALLINT & ~(RBM_FP | RBM_RA) & ~compiler->codeGen->regSet.rsMaskResvd);
#else
availableIntRegs = (RBM_ALLINT & ~compiler->codeGen->regSet.rsMaskResvd);
availableIntRegs = (RBM_ALLINT & ~compiler->codeGen->regSet.rsMaskResvd.getLow());
#endif

#if ETW_EBP_FRAMED
22 changes: 11 additions & 11 deletions src/coreclr/jit/lsra.h
Original file line number Diff line number Diff line change
@@ -1990,8 +1990,8 @@ class LinearScan : public LinearScanInterface
int BuildBinaryUses(GenTreeOp* node, SingleTypeRegSet candidates = RBM_NONE);
int BuildCastUses(GenTreeCast* cast, SingleTypeRegSet candidates);
#ifdef TARGET_XARCH
int BuildRMWUses(GenTree* node, GenTree* op1, GenTree* op2, regMaskTP candidates = RBM_NONE);
inline regMaskTP BuildEvexIncompatibleMask(GenTree* tree);
int BuildRMWUses(GenTree* node, GenTree* op1, GenTree* op2, SingleTypeRegSet candidates = RBM_NONE);
inline SingleTypeRegSet BuildEvexIncompatibleMask(GenTree* tree);
#endif // !TARGET_XARCH
int BuildSelect(GenTreeOp* select);
// This is the main entry point for building the RefPositions for a node.
@@ -2096,28 +2096,28 @@ class LinearScan : public LinearScanInterface
int BuildLclHeap(GenTree* tree);

#if defined(TARGET_AMD64)
regMaskTP rbmAllFloat;
regMaskTP rbmFltCalleeTrash;
SingleTypeRegSet rbmAllFloat;
SingleTypeRegSet rbmFltCalleeTrash;

FORCEINLINE regMaskTP get_RBM_ALLFLOAT() const
FORCEINLINE SingleTypeRegSet get_RBM_ALLFLOAT() const
{
return this->rbmAllFloat;
}
FORCEINLINE regMaskTP get_RBM_FLT_CALLEE_TRASH() const
FORCEINLINE SingleTypeRegSet get_RBM_FLT_CALLEE_TRASH() const
{
return this->rbmFltCalleeTrash;
}
#endif // TARGET_AMD64

#if defined(TARGET_XARCH)
regMaskTP rbmAllMask;
regMaskTP rbmMskCalleeTrash;
SingleTypeRegSet rbmAllMask;
SingleTypeRegSet rbmMskCalleeTrash;

FORCEINLINE regMaskTP get_RBM_ALLMASK() const
FORCEINLINE SingleTypeRegSet get_RBM_ALLMASK() const
{
return this->rbmAllMask;
}
FORCEINLINE regMaskTP get_RBM_MSK_CALLEE_TRASH() const
FORCEINLINE SingleTypeRegSet get_RBM_MSK_CALLEE_TRASH() const
{
return this->rbmMskCalleeTrash;
}
@@ -2152,7 +2152,7 @@ class LinearScan : public LinearScanInterface
// Not all of the callee trash values are constant, so don't declare this as a method local static
// doing so results in significantly more complex codegen and we'd rather just initialize this once
// as part of initializing LSRA instead
regMaskTP varTypeCalleeTrashRegs[TYP_COUNT];
SingleTypeRegSet varTypeCalleeTrashRegs[TYP_COUNT];
#endif // TARGET_XARCH

//------------------------------------------------------------------------
47 changes: 23 additions & 24 deletions src/coreclr/jit/lsraxarch.cpp
Original file line number Diff line number Diff line change
@@ -442,7 +442,7 @@ int LinearScan::BuildNode(GenTree* tree)
// Comparand is preferenced to RAX.
// The remaining two operands can be in any reg other than RAX.

const regMaskTP nonRaxCandidates = availableIntRegs & ~RBM_RAX;
const SingleTypeRegSet nonRaxCandidates = availableIntRegs & ~RBM_RAX;
BuildUse(addr, nonRaxCandidates);
BuildUse(data, varTypeIsByte(tree) ? (nonRaxCandidates & RBM_BYTE_REGS) : nonRaxCandidates);
BuildUse(comparand, RBM_RAX);
@@ -778,11 +778,11 @@ bool LinearScan::isRMWRegOper(GenTree* tree)
}

// Support for building RefPositions for RMW nodes.
int LinearScan::BuildRMWUses(GenTree* node, GenTree* op1, GenTree* op2, regMaskTP candidates)
int LinearScan::BuildRMWUses(GenTree* node, GenTree* op1, GenTree* op2, SingleTypeRegSet candidates)
{
int srcCount = 0;
regMaskTP op1Candidates = candidates;
regMaskTP op2Candidates = candidates;
SingleTypeRegSet op1Candidates = candidates;
SingleTypeRegSet op2Candidates = candidates;

#ifdef TARGET_X86
if (varTypeIsByte(node))
@@ -1042,8 +1042,8 @@ int LinearScan::BuildShiftRotate(GenTree* tree)
int srcCount = 0;
GenTree* shiftBy = tree->gtGetOp2();
GenTree* source = tree->gtGetOp1();
regMaskTP srcCandidates = RBM_NONE;
regMaskTP dstCandidates = RBM_NONE;
SingleTypeRegSet srcCandidates = RBM_NONE;
SingleTypeRegSet dstCandidates = RBM_NONE;

// x64 can encode 8 bits of shift and it will use 5 or 6. (the others are masked off)
// We will allow whatever can be encoded - hope you know what you are doing.
@@ -1151,7 +1151,7 @@ int LinearScan::BuildCall(GenTreeCall* call)
const ReturnTypeDesc* retTypeDesc = nullptr;
int srcCount = 0;
int dstCount = 0;
regMaskTP singleDstCandidates = RBM_NONE;
SingleTypeRegSet singleDstCandidates = RBM_NONE;

assert(!call->isContained());
if (call->TypeGet() != TYP_VOID)
@@ -1321,7 +1321,7 @@ int LinearScan::BuildCall(GenTreeCall* call)
// set reg requirements on call target represented as control sequence.
if (ctrlExpr != nullptr)
{
regMaskTP ctrlExprCandidates = RBM_NONE;
SingleTypeRegSet ctrlExprCandidates = RBM_NONE;

// In case of fast tail implemented as jmp, make sure that gtControlExpr is
// computed into appropriate registers.
@@ -1422,9 +1422,9 @@ int LinearScan::BuildBlockStore(GenTreeBlk* blkNode)

GenTree* srcAddrOrFill = nullptr;

regMaskTP dstAddrRegMask = RBM_NONE;
regMaskTP srcRegMask = RBM_NONE;
regMaskTP sizeRegMask = RBM_NONE;
SingleTypeRegSet dstAddrRegMask = RBM_NONE;
SingleTypeRegSet srcRegMask = RBM_NONE;
SingleTypeRegSet sizeRegMask = RBM_NONE;

RefPosition* internalIntDef = nullptr;
#ifdef TARGET_X86
@@ -1543,7 +1543,7 @@ int LinearScan::BuildBlockStore(GenTreeBlk* blkNode)
// or if are but the remainder is a power of 2 and less than the
// size of a register

regMaskTP regMask = availableIntRegs;
SingleTypeRegSet regMask = availableIntRegs;
#ifdef TARGET_X86
if ((size & 1) != 0)
{
@@ -1915,7 +1915,7 @@ int LinearScan::BuildModDiv(GenTree* tree)
{
GenTree* op1 = tree->gtGetOp1();
GenTree* op2 = tree->gtGetOp2();
regMaskTP dstCandidates = RBM_NONE;
SingleTypeRegSet dstCandidates = RBM_NONE;
int srcCount = 0;

if (varTypeIsFloating(tree->TypeGet()))
@@ -2131,7 +2131,7 @@ int LinearScan::BuildHWIntrinsic(GenTreeHWIntrinsic* intrinsicTree, int* pDstCou
dstCount = 0;
}

regMaskTP dstCandidates = RBM_NONE;
SingleTypeRegSet dstCandidates = RBM_NONE;

if (intrinsicTree->GetOperandCount() == 0)
{
@@ -2721,7 +2721,7 @@ int LinearScan::BuildHWIntrinsic(GenTreeHWIntrinsic* intrinsicTree, int* pDstCou

if (buildUses)
{
regMaskTP op1RegCandidates = RBM_NONE;
SingleTypeRegSet op1RegCandidates = RBM_NONE;

#if defined(TARGET_AMD64)
if (!isEvexCompatible)
@@ -2746,7 +2746,7 @@ int LinearScan::BuildHWIntrinsic(GenTreeHWIntrinsic* intrinsicTree, int* pDstCou

if (op2 != nullptr)
{
regMaskTP op2RegCandidates = RBM_NONE;
SingleTypeRegSet op2RegCandidates = RBM_NONE;

#if defined(TARGET_AMD64)
if (!isEvexCompatible)
@@ -2792,7 +2792,7 @@ int LinearScan::BuildHWIntrinsic(GenTreeHWIntrinsic* intrinsicTree, int* pDstCou

if (op3 != nullptr)
{
regMaskTP op3RegCandidates = RBM_NONE;
SingleTypeRegSet op3RegCandidates = RBM_NONE;

#if defined(TARGET_AMD64)
if (!isEvexCompatible)
@@ -2806,7 +2806,7 @@ int LinearScan::BuildHWIntrinsic(GenTreeHWIntrinsic* intrinsicTree, int* pDstCou

if (op4 != nullptr)
{
regMaskTP op4RegCandidates = RBM_NONE;
SingleTypeRegSet op4RegCandidates = RBM_NONE;

#if defined(TARGET_AMD64)
assert(isEvexCompatible);
@@ -2872,7 +2872,7 @@ int LinearScan::BuildCast(GenTreeCast* cast)
buildInternalIntRegisterDefForNode(cast);
}

regMaskTP candidates = RBM_NONE;
SingleTypeRegSet candidates = RBM_NONE;
#ifdef TARGET_X86
if (varTypeIsByte(castType))
{
@@ -2922,8 +2922,7 @@ int LinearScan::BuildIndir(GenTreeIndir* indirTree)
}
#endif // FEATURE_SIMD

regMaskTP indirCandidates = RBM_NONE;
int srcCount = BuildIndirUses(indirTree, indirCandidates);
int srcCount = BuildIndirUses(indirTree);
if (indirTree->gtOper == GT_STOREIND)
{
GenTree* source = indirTree->gtGetOp2();
@@ -2939,7 +2938,7 @@ int LinearScan::BuildIndir(GenTreeIndir* indirTree)
}
else
{
regMaskTP srcCandidates = RBM_NONE;
SingleTypeRegSet srcCandidates = RBM_NONE;

#ifdef TARGET_X86
// Determine if we need byte regs for the non-mem source, if any.
@@ -3046,7 +3045,7 @@ int LinearScan::BuildMul(GenTree* tree)

int srcCount = BuildBinaryUses(tree->AsOp());
int dstCount = 1;
regMaskTP dstCandidates = RBM_NONE;
SingleTypeRegSet dstCandidates = RBM_NONE;

bool isUnsignedMultiply = ((tree->gtFlags & GTF_UNSIGNED) != 0);
bool requiresOverflowCheck = tree->gtOverflowEx();
@@ -3144,7 +3143,7 @@ void LinearScan::SetContainsAVXFlags(unsigned sizeOfSIMDVector /* = 0*/)
// RBM_NONE if compatible with EVEX (or not a floating/SIMD register),
// lowSIMDRegs() (XMM0-XMM16) otherwise.
//
inline regMaskTP LinearScan::BuildEvexIncompatibleMask(GenTree* tree)
inline SingleTypeRegSet LinearScan::BuildEvexIncompatibleMask(GenTree* tree)
{
#if defined(TARGET_AMD64)
assert(!varTypeIsMask(tree));